題目大意:
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;
}
