LightOJ 1005 Rooks (排列数 组合数)

来源:互联网 发布:中石化邮箱域名是什么 编辑:程序博客网 时间:2024/05/29 14:42

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

题意:在一个n*n的棋盘上放k个车,使得各个车之间不相互攻击。有多少种放法?

思路:先在n行中选出k行,C(n,k),再在n列中选出k列随便放A(n,k),答案为C(n,k)*A(n,k)。

一直都记得0!=1,却忘了A(n,0)=1。。。。。。

#include <cstdio>__int64 C[32][32];__int64 A[32][32];void Init ()  {int i,j;for (i=1;i<=30;i++){C[i][0]=C[i][i]=1;for (j=1;j<i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j]);}for (i=0;i<=30;i++){A[i][0]=1;  //A[i][1]=i;for (j=2;j<=i;j++)A[i][j]=A[i][j-1]*(__int64)(i-j+1);}}int main (){  #ifdef ONLINE_JUDGE#elsefreopen("read.txt","r",stdin);freopen("out.txt","w",stdout);#endifint T;scanf("%d",&T);Init();for (int Cas=1;Cas<=T;Cas++){int n,k;scanf("%d%d",&n,&k);printf("Case %d: ",Cas);if (k>n)printf("0\n");elseprintf("%lld\n",A[n][k]*C[n][k]);}return 0;}/*In:181 12 027 716 916 1017 817 917 1017 1130 530 69 59 69 710 730 2030 230 1Out:Case 1: 1Case 2: 1Case 3: 3974530295736000Case 4: 47491411968000Case 5: 232707918643200Case 6: 23828156352000Case 7: 214453407168000Case 8: 1372501805875200Case 9: 6113871680716800Case 10: 2436955204320Case 11: 253849500450000Case 12: 1905120Case 13: 5080320Case 14: 6531840Case 15: 72576000Case 16: 353469769534668800Case 17: 378450Case 18: 900*/



原创粉丝点击