今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;......可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。
1 1
1 2 0
1 1
一、 错排原理的分析:
公式:f(N)=(N-1)[f(N-1)+f(N-2)].f(0)=1,f(1)=0 ;
第一步:将编号为1的元素放在第2到第n个位置之上:有n-1种方法
第二步:错排余下的n-1个元素
1、若1号元素划等号在第k个位置,第二步就是把K这个元素排好(因为K元素相对应的位置上已经被1给占领了)。如果恰好K这个元素也排在了1的位置上,那么接下来的n-2个 元素在与它们的编号相等的位置上再进行错排:有f(n-2)种方法
2、若K这个元素恰巧没排在第1个位置上。这时可将第1个位置“看成”第K个位置,于是就还余下n-1个元素的错排,有f(n-1)种方法。
思路:本题注意加个组合数C( n , i ) ,不完全错排;#include<cstdio>
#include<cstring>
typedef long long LL;
LL a[101];
LL C(LL n,LL m) //求组合数c(n,m);
{
LL ans=1,t1=1,t2=1;
for(int i=1;i<=m;i++)
{
t1*=i;
t2*=n;
n--;
}
ans=t2/t1;
return ans;
}
int main()
{
LL n,ans;
a[0]=1;
a[1]=0;
for(LL i=2;i<=25;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]); //递推dp式;
while(scanf("%lld",&n) && n)
{
ans=0;
for(LL i=0;i<=n/2;i++)
ans+=C(n,i)*a[i]; //正确题大于n/2的组合的和;
printf("%lld\n",ans);
}
return 0;
}