题目大意:
A,B两个sb比赛吃葡萄,葡萄上有编号1,2,....100,得分是每个人吃过葡萄的编号的乘积。
比如吃了 2, 5, 10 号葡萄,分数就是 2*5*10 = 100。
葡萄吃完后,两个人报自己的分数。当然,可以虚报。
如果某个人报的分数是吃不出来的,那就算他作弊,另外一个人赢。
如果两个人报的分数有冲突,则分数低的赢。
如果两个人报的分数没有冲突,则分数高的赢。
思路:
枚举每个人吃葡萄的所有情况。。
#include <stdio.h>
#include <string.h>
__int64 val2;
char used[101];
int dfs(__int64 val, int idx, int flag)
{
if (val == 1 || val == 0) {
if (!flag)
return 1;
return dfs(val2, 100, 0);
}
for ( ; idx > 1; idx--) {
if (!(val % idx) && !used[idx])
break;
}
if (idx == 1)
return 0;
used[idx] = 1;
if (dfs(val / idx, idx - 1, flag))
return 1;
used[idx] = 0;
if (dfs(val, idx - 1, flag))
return 1;
return 0;
}
int can(__int64 val, int flag)
{
memset(used, 0, sizeof(used));
return dfs(val, 100, flag);
}
int main()
{
__int64 a, b, r;
while (scanf("%I64d%I64d", &a, &b) != EOF) {
if (a > b) {
r = a;
a = b;
b = r;
}
val2 = b;
if (!can(a, 0))
r = b;
else if (!can(b, 0))
r = a;
else if (can(a, 1))
r = b;
else
r = a;
printf("%I64d\n", r);
}
return 0;
}