威佐夫博弈奇异态(必败态)的条件是a[k]=[k*(sqrt(5.0)+1.0)/2.0]。暴力找出必败态即可。
代码如下:
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> pii;
const int N = + ; int main()
{
int a,b;
while(scanf("%d%d",&a,&b)==)
{
if(a== && b==) break; if(a>b) swap(a,b);
int k = b-a;
int a_k = (sqrt(5.0)+1.0)/2.0*k;
if(a_k == a)
{
printf("0\n");
continue;
}
else
{
printf("1\n");
if(a_k<a)printf("%d %d\n",a_k,a_k+k);
double x = (sqrt(5.0)+1.0)/2.0;
set<pii> S;
for(int i=b-;i>=;i--)
{
int n = a;
int m = i;
if(n > m) swap(n,m);
int k = m - n;
if(n == (int)(k * x))
{
printf("%d %d\n",n,m);
S.insert(pii(n,m));
break;
}
}
for(int i=a-;i>=;i--)
{
int n = i;
int m = b;
int k = m - n;
if(n == (int)(k * x) && S.find(pii(n,m))==S.end())
{
printf("%d %d\n",n,m);
break;
}
}
}
}
}