Nim
Time Limit: 1000MS |
|
Memory Limit: 30000K |
Total Submissions: 1362 |
|
Accepted: 762 |
Description
Let ' s play a traditional game Nim. You and I is seated across a table and we have a hundred stones on the table (we know the number of stones exactly). We play in turn and at each turn, you or I can remove over to a four-stones from the heap. You play first and the one who removed the last stone loses.
The this game has a winning strategy. To see this, your first remove four stones and leave stones. No matter how I play, I'll end up with leaving 92-95 stones. Then you'll in turn leave stones to me (verify this is always possible). This is 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 had a winning strategy and you were 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 is seated around the table, with each player have opponents at both sides. Turn around the table so the the teams play alternately. Second, let's vary the maximum number of stones each player can take. That's, each player have his/her own maximum number of stones he/she can take at each turn (the minimum are always one). So the game was asymmetric and may even was unfair.
In general, when played between-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 be in each turn. In the other words, the 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 ta Ke at each turn. Your team plays first. Your job is, given those numbers, to instantaneously judge whether Your team have a winning strategy.
Incidentally, there is a rumor that captain the future and her officers of the Hakodate-maru love this game, and they are killing Their time playing it during their missions. You wonder where the stones is? Well, they does not has stones but does has plenty of balls in the fuel containers!
Input
The input is a sequence of lines, followed by the last line containing a zero. Each line except the last is a sequence of integers and have the following format.
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 is your team ' s players and 2nd, 4th, 6th, ... the opponents. Numbers is separated by a single space character. Assume 1 <= n <=, 1 <= Mi <=, and 1 <= S < 2^13.
Output
The output should consist of lines each containing either a one, meaning your team have a winning strategy, or a zero other Wise.
Sample Input
1 101 4 41 100 4 43 97 8 7 6 5 4 30
Sample Output
011
Very water .... DP[I][J] means I take the time, there are J stones ... Just a memory search.
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath > #include <algorithm> #include <cstdlib> #include <queue> #include <vector> #include < Stack>using namespace Std;int n,s,num[21],dp[21][(1<<13) +100];int dfs (int id,int remain) { if (dp[id][ REMAIN]!=-1) return Dp[id][remain]; if (remain==0) return dp[id][remain]=1; dp[id][remain]=0; for (int i=1;i<=num[id]&&i<=remain;i++) { if (!dfs ((id+1)% (2*n), remain-i)) dp[id][ remain]=1; } return Dp[id][remain];} int main () { while (scanf ("%d", &n)!=eof) { if (n==0) break ; scanf ("%d", &s); for (int i=0;i<2*n;i++) scanf ("%d", &num[i]); Memset (Dp,-1,sizeof (DP)); if (Dfs (0,s)) printf ("1\n"); else printf ("0\n"); } return 0;}
(game dp) POJ 2068