[fzu 2282]置换不动点大于等于k的排列数
2017-07-23 15:29
381 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2282
编号1~n的置换,不动点个数大于等于k的方案数。
参考百度百科错排公式,可以知道长度为n,每个数都不在自己位置的方案数。然后枚举长度即可。
考虑对立面(即小于k个在自己位置的)可以优化空间。
编号1~n的置换,不动点个数大于等于k的方案数。
参考百度百科错排公式,可以知道长度为n,每个数都不在自己位置的方案数。然后枚举长度即可。
考虑对立面(即小于k个在自己位置的)可以优化空间。
#include<cstdio> #include<algorithm> using namespace std; const int maxn=10005; const int md=1000000007; int D[maxn]; int C[maxn][105]; int F[maxn]; int main() { D[0]=1; D[1]=0; D[2]=1; for (int i=3;i<=10000;i++) { D[i]=1ll*(i-1)*(0ll+D[i-1]+D[i-2])%md; } C[0][0]=1; for (int i=1;i<=10000;i++) { C[i][0]=1; for (int j=1;j<=min(100,i);j++) { C[i][j]=(C[i-1][j-1]+C[i-1][j])%md; } } F[0]=1; for (int i=1;i<=10000;i++) { F[i]=1ll*F[i-1]*i%md; } int t; scanf("%d",&t); while (t--) { int n,k; scanf("%d%d",&n,&k); int ans=F ; for (int i=0;i<k;i++) { ans=(ans-1ll*C [i]*D[n-i]%md+md)%md; } printf("%d\n",ans); } return 0; }
相关文章推荐
- SHELL中IF大于等于小于的表示方法
- 大于等于0小于等于100的正数用正则表达式表示
- 在一个int数组里查找出所有这样的数,它大于等于左侧所有数,小于等于右侧所有数。
- 显示错误-无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount。
- mongoDB 大于,小于,大于等于,小于等于
- Lua两个table中B中所有元素大于等于A中每个元素的个数
- FZU 2282 错排
- 【FZU - 2282】 Wand 【错排+费马小定理】
- EL表达式中等于、不等于、小于、大于
- 当Xcode大于等于8时,如何使用Appium Desktop 获取iOS APP控件的id进行自动化测试
- seventh又来出题了 子区间的和大于等于0 逆序对+前缀和
- 查询来自不通地点的学生平均成绩,只显示平均成绩大于等于80的地区
- linux中shell逻辑表达式if else以及大于、小于、等于
- 不使用for完成一段有空格间隔的字符串,分辨长度大于等于4的单词(求各位高人修改,我表示我是菜鸟,这个算法实在太长了)
- 给定一个字符串和一个整数k,对字符串开头算起的每2k个字符的前k个字符进行反转。 如果还有少于k个字符,则将其全部撤消。 如果小于2k但大于或等于k个字符,则反转前k个字符,
- 索引(从零开始)必须大于或等于零,且小于参数列表的大小。
- 在JavaScript中什么东西不大于零并且不小于零并且不等于零,但却可以大于等于零,也可以小于等于零
- 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- 在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
- MyBatis 处理sql中的 大于,小于,大于等于,小于等于