ACM_错排

RPG的错排

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

今年暑假GOJ集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;......可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。

Input:

输入的数据里有多个case,每个case包括一个n,代表有几个女生,(n<=20), n = 0输入结束。

Output:

输出能使野骆驼过关的组数。

Sample Input:

1
2
0

Sample Output:

1
1
解题思路:错排(递推)+排列组合,比较基础。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;//采用long long是避免相乘过程中数据溢出
 4 using namespace std;
 5 LL C(int n,int m)//组合数求组合数c(n,m)
 6 {
 7     LL ans=1;
 8     for(int i=1;i<=m;i++)
 9         ans=ans*(n-i+1)/i;//求组合数的技巧
10     return ans;
11 }
12 int main()
13 {
14     int n;
15     LL a[15]={0,0,1},sum;//题目允许最多错排10个,所以数组长度开15足够了
16     for(int i=3;i<15;i++)
17         a[i]=(i-1)*(a[i-1]+a[i-2]);//错排公式
18     while(cin>>n && n){
19         sum=1;//表示0个错排,即全猜对了,这是其中的一种情况,所以sum从1开始
20         for(int i=1;i<=n/2;i++)//从1~n/2这里选择i个进行错排,即为题目要求的答案
21             sum+=C(n,i)*a[i];
22         cout<<sum<<endl;
23     }
24     return 0;
25 }
 

猜你喜欢

转载自www.cnblogs.com/acgoto/p/8987134.html