标签:limit 操作 mit etc ffffff proc while euc 打表
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3174 Accepted Submission(s): 1474
谁先先把其中一个数减为0的获胜。问谁可以赢。Stan是先手。
题解:没想太多打表过的。。
正确题解:
如果a==b.那么肯定是先手获胜。一步就可以减为0,b
如果a%b==0.就是a是b的倍数,那么也是先手获胜。
如果a>=2*b. 那么 那个人肯定知道a%b,b是必胜态还是必败态。如果是必败态,先手将a,b变成a%b,b,那么先手肯定赢。如果是必胜态,先手将a,b变成a%b+b,b.那么对手只有将这两个数变成a%b,b,先手获胜。
如果是b<a<2*b 那么只有一条路:变成a-b,b (这个时候0<a-b<b).这样一直下去看谁先面对上面的必胜状态。
所以假如面对b < a <2*b的状态,就先一步一步走下去。直到面对一个a%b==0 || a >=2*b的状态。
#include<bits/stdc++.h> #define N 35 #define mes(x) memset(x, 0, sizeof(x)); #define ll __int64 const long long mod = 1e9+7; const int MAX = 0x7ffffff; using namespace std; int dfs(int n, int m){ if(n > m) swap(n,m); if(n >= 2*m) return 1; if(n == 0) return 0; for(int i=m%n;i<m;i += n){ if(dfs(n, i) == 0) return 1; } return 0; } int main() { int n, m; while(~scanf("%d%d", &n, &m)&&(n||m)) printf("%s\n", dfs(n,m)?"Stan wins":"Ollie wins"); }
标签:limit 操作 mit etc ffffff proc while euc 打表
原文地址:http://www.cnblogs.com/Noevon/p/6248153.html