您的位置:首页 > 其它

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)!种+...-...

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: