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都是真实的,否则有一个是不真实的。