http://acm.hdu.edu.cn/showproblem.php?pid=2068
题型:错排+组合
刚开始还以为原来的那种输入ncase种情况,每种有n组的那种输入,__int64,double long long ,反复试,就是不对,其他人很多用double过的,不知道啥原因,longlong型的应该也可以不知道是不是vc版本啥的问题,会报错,又仔细念了题,原来是惯性思维在作怪,见到ncase,就以为是常见的那种。大意啊……
不过其中还是学到了一些关于错排的细节,以前理解的很泛泛。
Problem : 2068 ( RPG的错排 ) Judge Status : Accepted
RunId : 3064727 Language : G++ Author:rll
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
补充测试数据:输入 10 输出 13264
1 1
2 1
3 1
4 7
5 11
6 56
21 513349865698
2068
1 #include<stdio.h>
2 __int64 c(int n,int m)
3 {
4 __int64 i,t1=1,t2=1;
5 for(i=n;i>=n-m+1;i--)
6 t1*=i;
7 for(i=1;i<=m;i++)
8 t2*=i;
9 return t1/t2;
10 }
11 int main()
12 {
13 int i,k,r;
14
15 __int64 a[15],cr,n;
16
17 a[0]=0;a[1]=0;a[2]=1;
18 for(k=3;k<=15;k++)
19 a[k]=(k-1)*(a[k-1]+a[k-2]);
20
21 while(scanf("%I64d",&n)&&n)
22 {
23 r=n/2;cr=0;
24
25 for(i=2;i<=r;i++)
26 cr+=c(n,i)*a[i];//小于n/2的人的错排的和,即为所求
27 if(n==1||n==2)
28 printf("1\n");
29 else
30 printf("%I64d\n",cr+1);/*为啥+1呢?原来是错排公式的f[0]=1*/
31 }
32
33 return 0;
34 }
35