最近杭电在病娇什么啊,都上不去。。。
题意大概就是: 给你t个N*M的巧克力, 两个人轮流来分,先手只能竖直分,后手只能水平分,最后不能继续再分的人为输。
我刚开始的想法是用SG函数做,但是推一下就发现不对……然后就找规律……
画了不少图,可以发现,谁都不希望给对手1 × n(或者n × 1)的情况,因为这样对手就会比我多出n - 1步可以走,所以为了推迟1 × n(或者n × 1)这种情况的到来,在分的时候就要平分,然后后面的人要选小块的来分 。因为是平分,那么只要看平分后的其中一块就可以,因为其他块也是一样的情况,最后只要分到n × 1(或者1 × n)这种情况出现就可以定胜负了。还要注意,谁面对n × n这种情况一定是输的。
#include <stdio.h>
int main (void)
{
int t, n, c = 0;
scanf("%d", &t);
while(t --)
{
c ++;
scanf("%d", &n);
int i, a = 0, b = 0;
//a代表先手能切几次,b代表后手能切几次(只对于平分后的其中一块来说)
long long x, y;
for(i = 0; i < n; i++)
{
scanf("%lld %lld", &x, &y);
while(x > 1 && y > 1)
{
x /= 2;
y /= 2;
a ++;
b ++;
}
//printf("a = %d, b = %d\n", a, b);
if(x == 1)
b += y - 1;
if(y == 1)
a += x - 1;
//printf("a = %d, b = %d\n", a, b);
}
printf("Case %d : ", c);
if(a > b)
printf("Alice\n");
else
printf("Bob\n");
}
return 0;
}