题意:
一个取火柴游戏,可以取的数在一个集合S内,S必包含1,且不超过9个数,每个数都不大于9.最后取完者失败。
求n(n<10^9)根火柴时先取的胜利还是后取的胜利.
分析:
貌似有一种dp方程f[i]=max(f[i-P[j]]^1)
然后打个表貌似还有规律吧,而且规律好像也不长额,所以暴力找一下就好啦...#include <cstdio>
#include <cstring>
using namespace std;
const int MAXM = 10, MAXP = 505;
int N, M, P[MAXM], r;
bool f[MAXP], cap[MAXP];
int main()
{
int K;
scanf("%d", &K);
while(K--)
{
memset(P, 0, sizeof(P));
memset(f, 0, sizeof(f));
memset(cap, 0, sizeof(cap));
scanf("%d%d", &N, &M);
P[1] = 1;
M++;
for(int i = 2; i <= M; ++i)
scanf("%d", P+i);
cap[0] = true;f[0] = true;
for(int i = 1; i < 40; ++i)
for(int j = 1; j <= M; ++j)
if(i-P[j] >= 0 && cap[i-P[j]])
f[i] |= f[i-P[j]]^1, cap[i] = true;
r = 0;
for(int i = 18; i >= 1 && !r; --i)
for(int j = 0; j < i; ++j)
{
if(f[j] != f[j+i]) break;
if(j == i-1) r = i;
}
if(f[N%r])
puts("FIRST PLAYER MUST WIN");
else
puts("SECOND PLAYER MUST WIN");
}
return 0;
}