标签: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