/*/
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 威佐夫博弈
最新推荐文章于 2020-08-21 01:40:00 发布