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  

 

 

 

  

posted on 2010-10-12 22:47  role  阅读(1089)  评论(0编辑  收藏  举报