HDU 2177 威佐夫博弈
2017-02-10 22:31
155 查看
2017寒假集训 5-C
威佐夫博弈
传送门:HustOJ传送门:HDU
题意
有两堆石子,两人轮流取石子,轮到某人时,有两种取法,要么从两堆石子中同时取出一定数量的石子,要么只从一堆中取任意数量的石子,不能不取。不能取的人判为输。思路
如果不知道威佐夫博弈,就看这篇文。直接膜吧。%%%
关于威佐夫博弈,结论固定,必败态有公式。Xi=(向下取整)i∗1+5√2 Yi=Xi+i
但我更喜欢像上面博客那样记,Xi就是之前的XY没出现过的最小数字,Yi就是Xi+i。
任何一个非必败态就是必胜态。
代码
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <cmath> #include <queue> #include <stack> #define _ ios_base::sync_with_stdio(0);cin.tie(0); using namespace std; const int MAXN=1000007; const int oo=0x3f3f3f3f; typedef long long LL; const LL loo=4223372036854775807ll; typedef long double LB; int a[MAXN]; bool used[MAXN]; int main() { _ int n, m; int x=0,tx=0; for(int i=0;i<=MAXN;i++) { while(used[x]!=0) x++; if(x>=MAXN||i+x>=MAXN) break; a[i]=x; used[x]=used[i+x]=1; } while(cin>>n) { cin>>m; if(m==0&&n==0) break; if(m>n) swap(m, n); if(a[n-m]==m) cout<<0<<endl; else { bool flag=0; cout<<1<<endl; int cha=n-m; if(a[cha]<m) cout<<a[cha]<<' '<<a[cha]+cha<<endl, flag=1; for(int i=0;i<MAXN;i++) { if(a[i]+i==m) { if(flag!=1||cha!=i) { cout<<a[i]<<' '<<a[i]+i<<endl; break; } } } } } //system("pause"); return 0; }
相关文章推荐
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- [ACM] hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu 2177 取(2堆)石子游戏 (威佐夫博弈)(考虑如何变成奇异局势)
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- HDU - 2177 取(2堆)石子游戏 威佐夫博弈
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu_2177----威佐夫博弈
- 取(2堆)石子游戏 - HDU 2177 威佐夫博弈
- 威佐夫博弈 hdu 2177
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- 威佐夫博弈(hdu 1527和2177)
- hdu 2177 威佐夫博弈变形
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu 2177 威佐夫博弈+输出使你胜的你第1次取石子后剩下的两堆石子的数量
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- HDU - 2177 威佐夫博弈
- 【 HDU 2177 】取(2堆)石子游戏 (威佐夫博弈)
- HDU 2177 威佐夫博弈