题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095

题意:给出数字n,m,K(0<K<=m<=n)。在n个数字(1到n)的所有全排列中(有n!个),有多少个满足前m个数字恰有K个数字是不变的?

思路:首先应该在前m个中选出K个作为不变的,有C(m,K)种,接着,前m个中剩下的m-K个必须都不能自己放自己。后面还有n-m位,设p=m-K,q=n-m,则(p+q)!,即将剩余所有位全排列,这样肯定有前m位中剩下的m-K位放自己,所以要减去这些,根据容斥原理答案为C(m,K)*∑C(p,i)*(p+q-i)!*((-1)^i)(1<=i<=p)。

View Code #include <iostream>#include <cstdio>#include <cstring>#define int64 long longusing namespace std;const int64 MOD=1000000007;int C,num=0;int n,m,K;int64 b[1005],a[1005];int64 exGcd(int64 a,int64 b,int64 &x,int64 &y){int64 r,t;if(b==0){x=1;y=0;return a;}r=exGcd(b,a%b,x,y);t=x;x=y;y=t-a/b*y;return r;}void init(){int64 i,x,y;for(i=1;i<=1000;i++){exGcd(i,MOD,x,y);a[i]=x;a[i]=(a[i]%MOD+MOD)%MOD;}b[0]=1;b[1]=1;for(i=2;i<=1000;i++) b[i]=b[i-1]*i%MOD;}int64 ok(int n,int m){int64 ans=1;int i;for(i=n;i>=n-m+1;i--) ans=ans*i%MOD;for(i=1;i<=m;i++) ans=ans*a[i]%MOD;return ans;}int64 cal(){int64 ans=ok(m,K),temp;int i,t=-1,p=m-K,q=n-m;temp=b[p+q];for(i=1;i<=p;i++){temp+=t*b[p+q-i]%MOD*ok(p,i)%MOD;temp%=MOD;t*=-1;}if(temp<0) temp+=MOD;return ans*temp%MOD;}int main(){init();for(scanf("%d",&C);C--;){scanf("%d%d%d",&n,&m,&K);printf("Case %d: %lld\n",++num,cal());}return 0;}

  

LightOJ 1095 Arrange the Numbers(容斥原理)相关推荐

  1. cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)

    题意 题目链接 给出\(n\)个数,问任意选几个数,它们\(\&\)起来等于\(0\)的方案数 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到.. 考虑每一种方案 答案=任意一种方案 ...

  2. Codeforces 215E Periodical Numbers 容斥原理

    Periodical Numbers 我们先按长度分类对于当前处理的长度k, 我们令 F[ i ] 为有长度为 i 的循环节的方案数. 然后容斥出f[ i ] 表示最小循环节是 i 的方案数, 然后加 ...

  3. lightoj1095 Arrange the Numbers 组合数学

    题目: Consider this sequence {1, 2, 3 ... N}, as an initial sequence of first N natural numbers. You c ...

  4. UVa 11481 (计数) Arrange the Numbers

    居然没有往错排公式那去想,真是太弱了. 先在前m个数中挑出k个位置不变的数,有C(m, k)种方案,然后枚举后面n-m个位置不变的数的个数i,剩下的n-k-i个数就是错排了. 所以这里要递推一个组合数 ...

  5. UVA 11481 Arrange the Numbers(组合数学 错位排序)

    题意:长度为n的序列,前m位恰好k位正确排序,求方法数 前m位选k个数正确排,为cm[m][k],剩余m - k个空位,要错排,这m - k个数可能是前m个数中剩下的,也可能来自后面的n - m个数 ...

  6. kuangbin数学训练2

    LightOJ - 1058 Parallelogram Counting 题意 给出若干个点坐标,问最多能构成多少个不同的平行四边形 思路 找每条线段的中点重合即可 假如 m条线段的中点重合,则可构 ...

  7. 《算法入门经典大赛——培训指南》第二章考试

    UVa特别考试 UVa站点专门为本书设立的分类题库配合,方便读者提交: http://uva.onlinejudge.org/index.php?option=com_onlinejudge& ...

  8. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  9. 【CodeForces - 1153D】Serval and Rooted Tree(树形dp)

    题干: Now Serval is a junior high school student in Japari Middle School, and he is still thrilled on ...

最新文章

  1. 【职场】面试中最难回答频率最高的70个问题
  2. Linux系统用户和用户组介绍
  3. webstorm主要快捷键
  4. 1261:【例9.5】城市交通路网 《信息学奥赛一本通:动态规划基础》
  5. nucleo stlink 固件_自制nucleo,可以随意更换芯片,支持stlink,板载usbisp
  6. java label 超链接_Swing之带超链接的label简单实现。
  7. nedtworking
  8. css02基本选择器
  9. Understanding LSTM Networks(理解LSTM网络-colah‘s blog)
  10. 2022最新版sci和ssci双检索期刊,详细期刊目录值得了解!
  11. 操作系统课后答案第六章
  12. access 2016 迁移到 mysql_将ACCESS数据库迁移到SQLSERVER数据库两种方法(图文详解)
  13. 5GNR终端理论峰值速率计算
  14. 开源 5k star 的定时任务管理系统,我爱了!
  15. PS常用的三种抠图方法,能应对99%的抠图场景
  16. IT工具【日常随手记】
  17. 13部成功预知未来科技的科幻电影
  18. python缩写月份单词_Python替换月份为英文缩写的实现方法
  19. CSS导航栏 水平导航栏出炉
  20. JavaScript-相等和全等操作符

热门文章

  1. 华为推CPU Turbo,荣耀Note10突破3000档
  2. 如何让渣画质图片达到逼真效果,试试GAN吧
  3. Java 8 中的这个接口真好用!
  4. 非常有必要了解的Springboot启动扩展点
  5. 跟我学Springboot开发后端管理系统3:Mybatis-Plus实战2
  6. 不少Java程序员都觉得Lambda表达式很鸡肋,它到底有何用呢?
  7. MySQL:数据库优化,看这篇就够了
  8. Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
  9. 麻省理工开放官方课程项目!
  10. 9个让PyTorch模型训练提速的技巧!