教授发的

hdu1416 ,  pku 1078  ,  zju1003
             1014 gizilch  解题 报告

100个葡萄,标号为1,2,3,……,100。

2个人的初始成绩为1,吃了一个葡萄后,成绩就乘以葡萄号,最后
两个人申报自己的成绩,成绩高的获胜。

例如,两人成绩为343,49;
如果49是真的,说明49号是她吃了的。

那么343=7×49就是假的,因为再没有一个葡萄是49号。

假定申报数小的人是真实的,因为他要报假,为什么不多报呢?
因此报343的人说谎。49胜。
如果两个人申报都是真,则多者胜。
给出两个成绩 a,b ,  a!=b
判断a胜还是b胜;
分析:
定义数组x[101];
x[i]=1  表示第一个人吃了葡萄i;
x[i]=2  表示第二个人吃了葡萄i;
x[i]=3  表示第三个人吃了葡萄i;

在实际程序不必定义x: for(i=1;i<=3;i++)

搜索量似乎是 3^100;
 
但a,b是整数 <2^32-1;

因此大多数 x[i]=3;

如果a(声明得分是a的人)
吃了葡萄i,必须a%i==0
如果搜索到i,以前a的得分是s[i-1],b的是t[i-1];
那么i如果是 a吃,必须
(a/s[i-1])%i==0

在吃i后,s[i]=s[i-1]*i;

如果到某步后,a=s[i];且b=t[i],
说明a,b都是真实的,否则有一个是不真实的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值