https://vjudge.net/problem/Gym-101147A
题意:
给出G组数,每组数包括两个数B,N,两玩家轮流取数,使得N-num,num<=N并且num是N的整次幂。判断谁赢。
思路:
这道题目数据量很大,直接打表是不行的。
我们可以打一些数据出来观察一下,找一下规律。
规律是这样的:
如果B为奇数,那么SG函数0,1间隔出现。
如果B为偶数,你可以每B+1个数观察一下规律。
具体可以自己打个数据看一下。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 using namespace std; 11 typedef long long LL; 12 13 LL b,n; 14 15 int main() 16 { 17 freopen("powers.in","r",stdin); 18 int T; 19 scanf("%d",&T); 20 while(T--) 21 { 22 int num; 23 int pre=0; 24 int flag; 25 scanf("%d",&num); 26 for(int i=0;i<num;i++) 27 { 28 scanf("%lld%lld",&b,&n); 29 30 if(b&1) 31 { 32 if(n&1) flag=1; 33 else flag=0; 34 } 35 36 else 37 { 38 if(n%(b+1)==b) 39 flag=2; 40 else 41 flag=((n%(b+1))&1); 42 } 43 pre=pre^flag; 44 } 45 if(pre) puts("1"); 46 else puts("2"); 47 } 48 return 0; 49 }