利用威佐夫游戏的公式来判断当前局势是否为奇异局势,
ak = [k*(sqrt(5)+1)/2] , bk = ak+k;
然后暴力判断,因为每个自然数只在一种奇异局势中出现,所以找到结果后直接break掉就可以了.
#include <cstdio>
#include <cmath>
#define temp ((sqrt(5)+1)/2)
bool check ( int a , int b )
{
if ( a > b )
{
a = a^b;
b = a^b;
a = a^b;
}
if ( a == (int)(temp*(b-a))) return true;
return false;
}
int main ( )
{
int a,b;
while ( ~scanf ( "%d%d" , &a , &b ) , a+b )
{
if ( check ( a , b ) )
{
puts ( "0" );
continue;
}
puts ( "1" );
for ( int i = 1 ; i <= a ; i++ )
{
if ( check ( a-i , b-i ) )
printf ( "%d %d\n" , a-i , b-i );
}
for ( int i = 1 ; i <= a ; i++ )
if ( check ( a-i , b ) )
{
printf ( "%d %d\n" , a-i , b );
break;
}
if ( a == b ) continue;
for ( int i = 1 ; i <= b ; i++ )
if ( check ( a , b-i ) )
{
int tb = b-i;
if ( a > tb )
{
a = a^tb;
tb = a^tb;
a = a^tb;
}
printf ( "%d %d\n" , a , tb );
break;
}
}
}