您的位置:首页 > 其它

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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  威佐夫博弈