POJ 2368 巴什博奕

题目大意:给出n个按钮,每次最多可以按L个,按下最后一个按钮的人获胜。求使后手必定获胜的L的最小值(L>=2)。

题目思路:

巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
公式:n%(m+1)!=0 则先手胜,否则后手胜
 
变形:
对于巴什博弈,那么我们规定,如果最后取光者输,那么又会如何呢?
(n-1)%(m+1)==0则后手胜利。
 
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<map>
#define INF 0x3f3f3f3f
#define MAX 1005
#define Temp 1000000000
#define MOD 1000000007

using namespace std;

int main()
{
    int n,i,minn;
    while(scanf("%d",&n)!=EOF)
    {
        minn=n;
        for(i=2;i*i<=n;i++)
        {
            if(n%i==0 && i>2)
                minn=min(minn,i);
            if(n%i==0 && n/i>2)
                minn=min(minn,n/i);
        }
        if(minn >2)
            printf("%d\n",minn-1);
        else
            printf("0\n");
    }
    return 0;
}
View Code

 

posted @ 2016-10-11 15:51  声声醉如兰  阅读(313)  评论(0编辑  收藏  举报