标签:hdu 2177 取2堆石子游戏 博弈论 威佐夫博奕 acm
1 2 5 8 4 7 2 2 0 0
0 1 4 7 3 5 0 1 0 0 1 2
#include <stdio.h>
#include <math.h>
#define MAX 500010
int a[MAX],b[MAX] , cnt = 0;
bool find1(int x , int y)
{
int s = 1 , e = cnt;
while(s<=e)
{
int mid = (s+e)>>1 ;
if(x>a[mid])
{
s = mid + 1 ;
}
else if(x<a[mid])
{
e = mid - 1 ;
}
else
{
if(y>b[mid])
{
printf("%d %d\n",a[mid],b[mid]) ;
}
else
{
printf("%d %d\n",x*y-x,y-2*x+x*y) ; //参照网上的公式
}
return true ;
}
}
return false ;
}
bool find2(int x , int y)
{
int s = 1 , e = cnt;
while(s<=e)
{
int mid = (s+e)>>1 ;
if(x>b[mid])
{
s = mid + 1 ;
}
else if(x<b[mid])
{
e = mid - 1 ;
}
else
{
printf("%d %d\n",a[mid],b[mid]) ;
return true ;
}
}
return false ;
}
int main()
{
int n , m;
double p = (sqrt(5.0)+1)/2 ;
for(int i = 0 ; i < MAX ; ++i)
{
a[i] = (int)(i*p) ;
b[i] = a[i] + i ;
if(b[i]>2*MAX)
{
cnt = i ;
break ;
}
}
while(~scanf("%d%d",&m,&n) && (m||n))
{
if(m>n)
{
int temp = m ;
m = n ;
n = temp ;
}
if(m == (int)((n-m)*p))
{
puts("0") ;
continue ;
}
puts("1");
if(n-m == b[n-m]-a[n-m] && a[n-m]<m)
{
printf("%d %d\n",a[n-m],b[n-m]);
}
if(!find1(m,n))
{
find2(m,n) ;
}
}
return 0 ;
}hdu 2177 取(2堆)石子游戏 博弈论,,威佐夫博奕 ,提高题,不过测试数据奇水无比
标签:hdu 2177 取2堆石子游戏 博弈论 威佐夫博奕 acm
原文地址:http://blog.csdn.net/lionel_d/article/details/43939497