题目只要求他答对一半或以上就算过关,换句话说就是猜对了一半以上,其他的全部算是错排。
所以就是求1~n/2每项的错排数再乘以组合数(函数c(n,m)求组合数)之和。
错排:
void cuopai()//错排
{
s[1]=0;s[2]=1;
for(int i=3;i<=25;++i)
s[i]=(i-1)*(s[i-2]+s[i-1]);
}
组合数:
LL C(int n,int m)//组合数
{
LL ans=1;
if(m==0)
return 1;
for(int i=1;i<=m;++i)
{
ans *= (n-i+1);
ans=ans/i;
}
return ans;
}
#include
#include
#define LL long long
LL s[30];
void cuopai()//错排
{
s[1]=0;s[2]=1;
for(int i=3;i<=25;++i)
s[i]=(i-1)*(s[i-2]+s[i-1]);
}
LL C(int n,int m)//组合数
{
LL ans=1;
if(m==0)
return 1;
for(int i=1;i<=m;++i)
{
ans *= (n-i+1);
ans=ans/i;
}
return ans;
}
int main()
{
cuopai();
int n,i;
while(scanf("%d",&n),n)
{
LL sum=1,ans;
for(i=1;i<=n/2;++i)
{
ans=s[i]*C(n,i);
sum+=ans;
}
printf("%lld\n",sum);
}
return 0;
}