A - Calendar Game
题意:Adam 和 Eve 玩游戏。给出一个初始日期(1900年1月1日到2001年11月4日),可以选择两种操作。1.移动到该日期的下一天,2.移动到下个月的同一天。Adam 先手。谁移动到2001年11月4日则获胜,问 Adam 是否必胜。
分析:最后胜利的是奇数局势,即我们需要保证对面走偶数局势,即为我们必须一直占据奇数局势
注意点即为每个月的30号这天,因为可以转移到1号和下个月的30号造成不同的奇偶局势
而我们只需要考虑9月30日和11月30日,因为这两天是奇数开局并且为必败态
题解:
#include <iostream>
using namespace std;
int main(){
int t;
cin >> t;
while(t --){
int y, m, d;
cin >> y >> m >> d;
if((m+d)%2==0 || (d==30 && (m==9 || m==11))) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
B - Euclid’s Game
题意:两个玩家 Stan 和 Ollie
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
ll cnt;
void fun(ll x,ll y){
cnt++;
if(x!=y && x<2*y) fun(y,x-y);
}
int main(){
ll n,m;
while(scanf("%lld%lld",&n,&m) && (n&&m)){
cnt=0;
if(n<m) swap(n,m);
fun(n,m);
if(cnt%2!=0) puts("Stan wins");
else puts("Ollie wins");
}
return 0;
}
C - Play a game
#include <cstdio>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n) && n){
if(n%2==0) puts("8600");
else puts("ailyanlu");
}
return 0;
}
D - Brave Game
#include <cstdio>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t --){
int n, m;
scanf("%d%d",&n,&m);
if(n%(m+1)!=0) puts("first");
else puts("second");
}
return 0;
}
E - Good Luck in CET-4 Everybody!
巴什博弈
#include <cstdio>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)){
if(n%3) puts("Kiki");
else puts("Cici");
}
return 0;
}
F - 取石子游戏
斐波那契博弈
#include <cstdio>
#define ll long long
ll a[15010];
void fib(int n){
int n1=1, n2=1, ret=1;
for(int i=3; i<=n; i++){
ret=n1+n2;
n1=n2;
n2=ret;
a[i]=ret;
}
}
int main(){
a[1]=1;a[2]=1;
fib(15000);
int n;
while(~scanf("%d", &n) && n){
int flag=1;
for(int i=1; i<=15000; i++){
if(a[i]==n){
flag=0;
break;
}
}
if(flag) puts("First win");
else puts("Second win");
}
return 0;
}
G - 邂逅明下
#include <cstdio>
int main(){
int n, p, q;
while(~scanf("%d%d%d",&n,&p,&q)){
int temp = n%(p+q);
if(temp!=0 && temp<=p) puts("LOST");
else puts("WIN");
}
return 0;
}
H - Nim or not Nim?
SG打表找规律
#include <cstdio>
#include <cstring>
int sg[1010],vis[1010];
int fun(int x){
if(sg[x]!=-1) return sg[x];
memset(vis,0,sizeof(vis));
for(int i=x; i>0; i--) vis[fun(x-i)]=1;
for(int i=1; i<=x/2; i++){
int t = fun(i)^fun(x-i);
vis[t]=1;
}
for(int i=0; ; i++) if(vis[i]==0) return sg[x]=i;
}
int main(){
memset(sg,-1,sizeof(sg));
sg[0]=0;
sg[1]=1;
for(int i=1; i<=30; i++)
printf("%d %d\n",i,fun(i));
return 0;
}
#include <cstdio>
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,ans = 0;
scanf("%d",&n);
for(int i=0; i<n; i++){
int m;
scanf("%d",&m);
if(m%4==0) ans^=(m-1);
else if(m%4==3) ans^=(m+1);
else ans^=m;
}
if(ans) puts("Alice");
else puts("Bob");
}
return 0;
}
I - Game
阶梯博弈
#include <cstdio>
int main(){
int t,o=1;
scanf("%d",&t);
while(t--){
int n,ans=0;
scanf("%d",&n);
for(int i=1; i<=n; i++){
int x;
scanf("%d",&x);
if(i%6==2 || i%6==5 || i%6==0)
ans^=x;
}
if(ans) printf("Case %d: Alice\n",o++);
else printf("Case %d: Bob\n",o++);
}
return 0;
}
J - Daizhenyang’s Coin
sg
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e4+10;
int sg[maxn],vis[maxn];
int main(){
int i,j,k;
sg[0]=1;
for(i=1; i<=1000; i++){
memset(vis,0,sizeof(vis));
vis[0]=1;
for(j=0; j<i; j++)
vis[sg[j]]=1;
for(j=0; j<i; j++)
for(k=0; k<j; k++)
vis[sg[j]^sg[k]]=1;
for(j=0; ; j++)
if(!vis[j]) break;
sg[i]=j;
}
for(i=1;i<=20;i++)
printf("%d %d\n",i,sg[i]);
}