LightOJ 1095 Arrange the Numbers-容斥
2016-07-14 19:58
459 查看
给出n,m,k,求1~n中前m个正好有k个在原来位置的种数(i在第i个位置)
做法:容斥,先选出k个放到原来位置,然后剩下m-k个不能放到原来位置的,用0个放到原来位置的,有C(m-k,0)*(n-k)!种 - 1个放原来位置的,有C(m-k,1)*(n-k-1)!种+...-...
View Code
做法:容斥,先选出k个放到原来位置,然后剩下m-k个不能放到原来位置的,用0个放到原来位置的,有C(m-k,0)*(n-k)!种 - 1个放原来位置的,有C(m-k,1)*(n-k-1)!种+...-...
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e3+10; const int INF=0x3f3f3f3f; const int mod=1e9+7; int cas=1,T; int n,m,k,c ; LL fac ; void init() { memset(c,0,sizeof(c)); c[0][0]=fac[0]=1; for(int i=1;i<N;i++) { fac[i]=fac[i-1]*i%mod; c[i][0]=1; for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; } //for(int i=0;i<100;i++) //{ //for(int j=0;j<=i;j++) printf("%d ",c[i][j]); //printf("\n"); //} } int main() { //freopen("1.in","w",stdout); //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); init(); scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); LL ans=0; for(int i=0;i<=m-k;i++) { if(i&1) ans-=c[m-k][i]*fac[n-k-i]%mod; else ans+=c[m-k][i]*fac[n-k-i]%mod; ans%=mod; //printf("%lld\n",ans); } ans=ans*c[m][k]%mod; printf("Case %d: %lld\n",cas++,(ans+mod)%mod); } //printf("time=%.3lf\n",(double)clock()/CLOCKS_PER_SEC); return 0; }
View Code
相关文章推荐
- Remove Nth Node From End of List
- Vim自动补全神器:YouCompleteMe
- java常用数据结构常用方法
- char* TCHAR* String相互转化
- 部分手机WebView无法成功同步Cookie问题的解决方案
- hdu 2000 ASCII码排序
- App.config 中读写appSettings、system.serviceModel终结点,以及自定义配置节
- 今天的我更加愚蠢了呢
- linux日志相关
- Git 学习笔记一
- 判断字符串是否为合法整数
- 4-11 先序输出叶结点 (15分)
- JavaScript跨域的6种方法
- JAVA 利用Throwable和Thread分析堆栈跟踪元素
- 推送服务定制
- UVA 10720 Graph Construction 贪心+优先队列
- transient的理解
- 基于树莓派的Hadoop集群搭建
- Java 数据保存与读取,保存数据信息并加密
- nagios被监控机安装脚本