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多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。
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 }