# 「POJ2068」Nim

Description

In this game, you have a winning strategy. To see this, you first remove four stones and leave 96 stones. No matter how I play, I will end up with leaving 92 – 95 stones. Then you will in turn leave 91 stones for me (verify this is always possible). This way, you can always leave 5k+1 stones for me and finally I get the last stone, sigh. If we initially had 101 stones, on the other hand, I have a winning strategy and you are doomed to lose.

Let’s generalize the game a little bit. First, let’s make it a team game. Each team has n players and the 2n players are seated around the table, with each player having opponents at both sides. Turn around the table so the two teams play alternately. Second, let’s vary the maximum number of stones each player can take. That is, each player has his/her own maximum number of stones he/she can take at each turn (The minimum is always one). So the game is asymmetric and may even be unfair.

In general, when played between two teams of experts, the outcome of a game is completely determined by the initial number of stones and the maximum number of stones each player can take at each turn. In other words, either team has a winning strategy.

You are the head-coach of a team. In each game, the umpire shows both teams the initial number of stones and the maximum number of stones each player can take at each turn. Your team plays first. Your job is, given those numbers, to instantaneously judge whether your team has a winning strategy.

Incidentally, there is a rumor that Captain Future and her officers of Hakodate-maru love this game, and they are killing their time playing it during their missions. You wonder where the stones are? Well, they do not have stones but do have plenty of balls in the fuel containers!

Input

n S M1 M2 . . . M2n

where n is the number of players in a team, S the initial number of stones, and Mi the maximum number of stones ith player can take. 1st, 3rd, 5th, … players are your team’s players and 2nd, 4th, 6th, … the opponents. Numbers are separated by a single space character. You may assume 1 <= n <= 10, 1 <= Mi <= 16, and 1 <= S < 2^13.

Output

Sample Input

1 2 3 4 |
1 101 4 4 1 100 4 4 3 97 8 7 6 5 4 3 0 |

Sample Output

1 2 3 |
0 1 1 |

博弈论加dp

如果一个局面可以转化成负局面，那么它是一个胜局面

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,s,a[21]; int dp[21][10001]; int dfs(int x,int s) { if(x>2*n)x=1; if(dp[x][s]!=-1)return dp[x][s]; for(int i=1;i<=a[x];i++) { int t=s-i; if(t<0)break; if(!dfs(x+1,t)) return dp[x][s]=1; } return dp[x][s]=0; } int main() { while(scanf("%d",&n)) { if(!n)return 0; scanf("%d",&s); for(int i=1;i<=2*n;i++) scanf("%d",&a[i]); memset(dp,-1,sizeof(dp)); for(int i=1;i<=2*n;i++) dp[i][0]=1; int ans=dfs(1,s); if(!ans)puts("0"); else puts("1"); } } |