hdu 2869 Paper Cutting Game
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2869
View Code
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdio> 5 #include <string> 6 #include <stdlib.h> 7 #include <algorithm> 8 using namespace std; 9 typedef long long LL; 10 const LL Mod= 1e9+7; 11 int N, M, tot; 12 int p[100], a[1000]; 13 void getp( ) 14 { 15 p[0]=2; 16 for( int i=3; i<40; i+=2 ){ 17 if( !a[i] ){ 18 for( int j=i+i; j<1000; j+=i ) 19 a[j]=1; 20 } 21 } 22 for( int j=3; j<1000; j+=2 ) 23 if( !a[j] ) 24 p[++tot]=j; 25 } 26 int AC( int x ) 27 { 28 int ans=0; 29 for( int i=0; p[i]&&p[i]<=x; ++ i ){ 30 while( x%p[i]==0 ){ 31 ans++; 32 x/=p[i]; 33 } 34 } 35 return ans; 36 } 37 int main( ) 38 { 39 getp(); 40 while( scanf("%d%d", &N,&M)==2 ){ 41 if( AC( N )<=AC(M) )puts( "Lose" ); 42 else puts( "Win" ); 43 } 44 return 0; 45 }
poj 2311
链接: http://poj.org/problem?id=2311
SG应用的场景
游戏有两个人参与,二者轮流做出决策。且这两个人的决策都对自己最有利。
当有一人无法做出决策时游戏结束,无法做出决策的人输。
无论二者如何做出决策,游戏可以在有限步内结束。
游戏中的同一个状态不可能多次抵达。且游戏不会有平局出现。
任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关。
View Code
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdio> 5 #include <string> 6 #include <stdlib.h> 7 #include <algorithm> 8 using namespace std; 9 typedef long long LL; 10 const LL Mod= 1e9+7; 11 int N, M; 12 int sg[205][205]; 13 int mex(int x, int y) 14 { 15 if( sg[x][y]!=-1 )return sg[x][y]; 16 bool re[205]={0}; 17 int i; 18 for( i=2;i<=x/2;++i ){ 19 re[mex(i, y)^mex(x-i, y)]=1; 20 } 21 for( i=2;i<=y/2;++i ){ 22 re[mex(x, i)^mex(x, y-i)]=1; 23 } 24 i=0; 25 while( re[i] )++i; 26 return sg[x][y]=i; 27 } 28 int main( ) 29 { 30 memset( sg, -1 , sizeof sg); 31 sg[2][2]=sg[2][3]=sg[3][2]=0; 32 while( scanf("%d%d", &N,&M)==2 ){ 33 if( N==1 || M==1 )puts("LOSE"); 34 else if( mex( N, M ) )puts( "WIN" ); 35 else puts("LOSE"); 36 } 37 return 0; 38 }