hdu 2897 邂逅明下

题意:每行有三个数字n,p,q,表示一堆硬币一共有n枚,从这个硬币堆里取硬币,一次最少取p枚,最多q枚,如果剩下少于p枚就要一次取完。两人轮流取,直到堆里的硬币取完,最后一次取硬币的算输。对于每一行的三个数字,给出先取的人是否有必胜策略,如果有回答WIN,否则回答LOST。你把对应的答案发给我,如果你能在今天晚上8点以前发给我正确答案,或许我们明天下午可以再见。”
小t二话没说,将自己的邮箱给了mm。当他兴冲冲得赶回家,上网看邮箱,哇!mm的邮件已经到了。他发现文本长达100000行,每行的三个数字都很大,但是都是不超过65536的整数。小t看表已经下午6点了,要想手工算出所有结果,看来是不可能了。你能帮帮他,让他再见到那个mm吗?

题解:类似巴什博弈找出区间[1-p]必败  [p+1,p+q]必胜(取一个q,就能进入第一个区间) [p+q+1,2*p+q]必败,[2*p+q+1,2*p+2*q]必胜

#include
#include
#include
using namespace std;

int main(){
    int n,p,q;
    while(~scanf("%d%d%d",&n,&p,&q)){
        if(n%(p+q)==0){
            puts("WIN");
        }else {
            int tmp=n%(p+q);
            if(tmp<=p){
                puts("LOST");
            }else
                puts("WIN");
        }
    }
    return 0;
}

你可能感兴趣的:(博弈论)