FZU 2282 Wand(组合)
来源:互联网 发布:mac sudo chown r 编辑:程序博客网 时间:2024/06/08 10:15
http://acm.fzu.edu.cn/problem.php?pid=2282
题目大意:
1~n个数中至少有k个数在对应下标的k个位置,其他的数都为错排。问有多少种排列方式?
解题思路:
n个数的错排公式
D(n)=(n-1) * ( D(n-1) + D(n-2) )
然后是从n个数中选取n-i个数进行错排(k<=i<=n),就需要用到递推公式
和组合公式。考虑到会超时,用快速幂和预处理打表处理。
#include<iostream>#include<cstdio>using namespace std;#define mod 1000000007typedef long long LL;LL d[10005],a[10005],b[10005];LL quickmod(LL x,LL y) //快速幂{ LL ans=1; while(y) { if(y&1) ans=ans*x%mod; x=x*x%mod; y>>=1; } return ans%mod;}void Init() //预处理打表 { a[0]=b[0]=1; for(int i=1;i<=10000;i++) { a[i]=a[i-1]*i%mod; b[i]=quickmod(a[i],mod-2); //除法求逆元 }}int main(){ d[1]=0,d[2]=1; for(int i=3;i<=10000;i++) d[i]=(i-1)*((d[i-1]+d[i-2])%mod)%mod; //错排公式 D(n)=(n-1) * ( D(n-1) + D(n-2) ) Init(); int t,n,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); int cnt=n-k; LL ans=1; for(int i=2;i<=cnt;i++) ans=(ans+(a[n]*b[i])%mod*b[n-i]%mod*d[i]%mod)%mod; printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- FZU 2282 Wand(组合)
- FZU 2282 Wand 【组合数学】
- FZU 2282 Wand (组合数学 错排应用)
- fzu 2282 Wand
- FZU 2282 Wand(错排+费马小定理)
- FZU 2282 Wand(错排+费马小定理)
- fzu-Wand
- FZU 2282Problem 2282 Wand(错排+快速幂+费马小定理)
- 【组合数+全错排】fzuoj 2282 Wand
- FZU 2282 Wand,利用扩展欧几里得求逆元快速求C(n,m) , 错排公式推导
- FZUOJ 2282 Wand
- 第八届福建省大学生程序设计竞赛-K Wand(错位+组合数)
- FZU 2020 组合(Lucas定理)
- FZU 2020 组合(Lucas定理)
- FZU - 2020 组合(逆元+卢卡斯)
- FZU 2020 组合(扩展欧几里得)
- FZU 2231 平行四边形数 (组合计数)
- FZU 2020 组合 -- (大组合数取模 Lucas定理)
- studio无网络时跳转到设置页
- Spring Security——基于方法的权限控制
- HDU6166-Senior Pan
- Python中的类
- Java 基础语法
- FZU 2282 Wand(组合)
- 逻辑回归原理
- 这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已
- double型数值转换为String型字符
- Angular2 入门详解
- 在一个字符串中找到第一个只出现一次的字符
- js基础
- 让浏览器可以访问我们的socket服务 (http协议入门)
- NekoHTML 学习笔记