Problem Description
今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;......可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。
 
Input
输入的数据里有多个case,每个case包括一个n,代表有几个女生,(n<=25), n = 0输入结束。
 
Sample Input
1
2
0
 
Sample Output
1
1
解题思路:要求出最少一半是猜对的,那么少于一半是不对应的。那么要想完成这个事件,分成两步,第一步:从n个人中取出n/2个人,用排列组合,第二步:从取出的n/2人中对应的人和名字要全都错,则用错排公式,两步得出的数相乘得出一部分结果。再重复以上两步,人数变成n/2-1个人,结果与上一个结果相加,依次类推……。得出最后正确答案。
#include<stdio.h>
__int64 cuobai[15],da[27];
__int64 c(int n,int m)//从n个中取m个的种数
{
__int64 cc=1,in=1;
for(int i=n;i>=n-m+1;i--)
cc*=i;
for(int i=2;i<=m;i++)
in*=i;
return cc/in;
}
void init()
{
cuobai[1]=0; cuobai[2]=1;
for(int i=3;i<=13;i++)//求i个人错排的种数
cuobai[i]=(cuobai[i-1]+cuobai[i-2])*(i-1);
da[1]=da[2]=da[3]=1;
for(int i=4;i<=25;i++){
da[i]=1;//全对只有一种
for(int j=1;j<=i/2;j++)
da[i]+=c(i,j)*cuobai[j];
}
}
int main()
{
int n;
init();
while(scanf("%d",&n)>0&&n)
{
printf("%I64d\n",da[n]);
}
}

最新文章

  1. ubuntu 安装MTK 移动终端usb驱动
  2. Activity、Task、应用和进程
  3. Js获取下拉框当前选择项的文本和值
  4. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]
  5. 命令行 更新Android sdk
  6. Android USB Connections Explained: MTP, PTP, and USB Mass Storage
  7. display:none,overflow:hidden,visibility:hidden之间的区别
  8. IOS 免受xib自动布局影响
  9. EF Code First学习笔记 初识Code First
  10. Shell脚本——中继DHCP服务器自动部署
  11. JS操作SELECT方法
  12. hibernate spring 事务配置
  13. 变身windows达人,用运行命令直接启动所有应用程序
  14. java中文乱码问题
  15. LeetCode——Linked List Cycle II
  16. javascript焦点图(根据图片下方的小框自动播放)
  17. STM32学习笔记:【001】时钟树与RCC
  18. vue 之iview
  19. PyCharm 新建文件时默认添加作者时间等
  20. ubuntu 登陆信息打印 -- motd

热门文章

  1. thinkphp1
  2. JDBC编程
  3. iOS一些编译运行问题
  4. JQuery中on()函数详解
  5. Windows 7无法卸载及安装IE11的解决方法
  6. mysql查询正在执行的进程
  7. 准备上线,切换到master分支,报错
  8. Execel(导出新方法):
  9. Android--Intent(意图)
  10. 使用ionic2开发一个登录功能