代码如下:
//威佐夫博奕模板 谁先面临奇异局势 谁输。(ak,bk) 之间的关系
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int f = 1000006;
map<int, map<int,int> > vis;
int ans[f][2];
int main() {
int a,b,i,j;
//memset(hash,0,sizeof(hash));
double k1=(sqrt(5.0)+1)/2.0;
int len=1;
ans[0][0]=ans[0][1] = 0;
b=0;
while(b<=1000000) {//打印奇异局势表
a=len*k1;
b=a+len;
//if(hash[a]) continue;
ans[len][0]=a;
ans[len++][1] = b;
}
// cout<<len<<endl;
while(scanf("%d%d",&a,&b)!=EOF &&a+b) {
if(a>b) swap(a,b);
i=b-a;
int t = i*k1;
if(a==t) printf("0\n");
else {
printf("1\n");
if(a==b) {
printf("0 0\n");
vis[0][0]= 1;
}
else if(a-ans[i][0]==b-ans[i][1] && a-ans[i][0]>0&& b-ans[i][1]>0) {
printf("%d %d\n",ans[i][0],ans[i][1]);
vis[ans[i][0]][ans[i][1]] =1;
}
for(i=1; i<len; i++) {
if(ans[i][0]==a && !vis[ans[i][0]][ans[i][1]])
printf("%d %d\n",ans[i][0],ans[i][1]);
if(ans[i][1]==a &&!vis[ans[i][0]][ans[i][1]]){
printf("%d %d\n",ans[i][0],ans[i][1]);
break;
}
}
}
}
return 0;
}