HDU 2177 威佐夫博弈
2015-01-22 18:52
239 查看
/*///////////////////////////// HDU 2177 题意: 威佐夫博弈的第一步如何走。 分析: 先打表出1000000的a、b表。 按照n==m和n!=m两种情况。 n==m时会变成0 0 ,还有可能是当n==b[i] 则m拿去m-a[i] 个就会变成a[i],b[i]的奇异局势。 n!=m时 m==a[i]&&n>b[i] ==> a[i] b[i] m>a[i]&&n==b[i] ==> a[i] b[i] n-m==i&&n>b[i]&&m>a[i] ==> a[i] b[i] n-m!=i&&m==b[i] ==> a[i] b[i] /////////////////////////////*/ #include<cstdio> #include<iostream> #include<cmath> using namespace std; int a[1000000+10]; int b[1000000+10]; int main() { // freopen("in.txt","r",stdin); int m,n; a[0]=0;b[0]=0; for(int i=1;i<=1000000;i++) { a[i]=floor(i*(1+sqrt(5.0))/2.0); b[i]=a[i]+i; } while(scanf("%d %d",&m,&n)!=EOF&&(m+n)) { int k=n-m; if(a[k]==m) printf("0\n"); else { printf("1\n"); if(n==m) { printf("0 0\n"); for(int i=1;i<m;i++) { if(n==b[i]&&m>a[i]) printf("%d %d\n",a[i],b[i]); } continue; } for(int i=n-1;i>=1;i--) { if(m==a[i]&&n>b[i]) // 2 { printf("%d %d\n",a[i],b[i]); } if(m>a[i]&&n==b[i]) // 4 printf("%d %d\n",a[i],b[i]); if(n-m==i&&n>b[i]&&m>a[i]) //5 printf("%d %d\n",a[i],b[i]); if(n-m!=i&&m==b[i]) // 6 printf("%d %d\n",a[i],b[i]); } } } return 0; }
相关文章推荐
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu 2177 威佐夫博弈+输出使你胜的你第1次取石子后剩下的两堆石子的数量
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- 【 HDU 2177 】取(2堆)石子游戏 (威佐夫博弈)
- HDU - 2177 威佐夫博弈
- HDU 2177 取(2堆)石子游戏 (威佐夫博弈)
- hdu 2177 取(2堆)石子游戏 (威佐夫博弈求取后状态+二分)
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- 威佐夫博弈输出第一次如何取-HDU2177
- hdu 2177 威佐夫博弈
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- HDU 1527 取石子游戏 +HDU 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu 2177 威佐夫博弈
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- 威佐夫博弈 hdu 2177
- 威佐夫博弈hdu 1527 && hdu 2177
- hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- [ACM] hdu 2177 取(2堆)石子游戏(威佐夫博弈)
- hdu-2177(威佐夫博弈。Wythoff Game)