1.今天是光棍节。聪明的NS想到了一个活动来丰富这个光棍节。规则如下:每个光棍在一个纸条上写一个自己心仪女生的名字,然后把这些纸条装进一个盒子里,这些光 棍依次抽取一张纸条,如果上面的名字就是自己心仪的女生,那么主持人就在现场给该女生打电话,告诉这个光棍对她的爱慕之情,并让光棍当场表白,并得到现场所有人的祝福,没抽到的,嘿嘿就可以幸免了。假设一共有N个光棍,其中有M个没有抽到自己的纸条,求发生这种情况一共有多少种可能.。输入 每行包含两个整数N和M(1<M<=N<=20),以EOF结尾。 输出 对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。
解析:由于另外(n-m)人已经拿到自己的卡片,所以这m人是全错位,只需选择出这m人并乘以全错位。
1 #include<stdio.h> 2 3 long long a[22]; 4 5 void quancuowei() 6 { 7 int i; 8 a[1]=0,a[2]=1; 9 for(i=3;i<=21;i++) 10 a[i]=(i-1)*(a[i-1]+a[i-2]); 11 } 12 13 long long zuhe(int n,int m) 14 { 15 int a,b,ans; 16 a=n-m+1;b=1,ans=1; 17 while(a<=n&&b<=m) 18 { 19 ans=ans*a/b; 20 a++; 21 b++; 22 } 23 return (long long)ans; 24 } 25 26 int main() 27 28 { 29 int i,j;int m,n; 30 long long ans; 31 quancuowei(); 32 while(scanf("%d%d",&n,&m)!=EOF) 33 { 34 printf("%lld\n",zuhe(n,m)*a[m]); 35 } 36 return 0; 37 }
2.经典矩阵相乘
1 //a[m][n]*b[n][k] = c[m][k] 2 for(int i=0; i<m; i++) 3 { 4 for(int j=0; j<k; j++) 5 { 6 int sum = a[i][0]*b[0][j]; 7 for(int t=0; t<n; t++) 8 { 9 sum += a[i][t]*b[t][j]; 10 } 11 c[i][j] = sum; 12 } 13 } 14 //都用了临时变量sum,我写的时候一般没用