题目大意:
给定一个数 n, p, q;两人轮流取,最少取p个,最多取q个,最后剩余不足p个一次性取完,最后取完者获胜。
问先取者是否有必胜的策略。
题目链接
HDU 2897 邂逅明下
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<iomanip>
using namespace std;
/**
2018/1/20
已完成
**/
int main()
{
int n,p,q;
while(scanf("%d%d%d",&n,&p,&q)!=EOF)
{
if(!((n%(p+q) != 0)&&((n%(p+q)) <= p))) puts("WIN");
else puts("LOST");
}
return 0;
}
主要在于P态和N态的确定,首先n取1, 2, …p时第二个人赢,在n取p+1, p+2, …..,q, q+1, ..q+p时第一个人必胜,且若第一个人取m个(p <= m <= q),则第二个人取p+q-m,则得到取 n = (p+q)*r + s,当 s != 0 && s <= p时,先取者为必败状态,否则先取者必胜。