POJ2368 巴什博弈

来源:互联网 发布:linux网卡配置ip地址 编辑:程序博客网 时间:2024/04/30 05:51

题目:题目链接

题意:这道题目的意思是说,目前有k个石子,让你求出一个最小的数L,使得后手能够赢得比赛。游戏的规则是两个人轮流拿石子,每个人每次最少拿一个,最多拿m个。


分析:这道题目就是普通的巴什博弈,巴什博弈正向的是求谁赢谁输,这道题就是反过来。还是那个公式,如果k%(L+1)==0.那么后手赢,所以我们只要找到K的因子中最小的大于2的数减去1就是我们所求的L。就是这样了,代码:

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <cmath>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>using namespace std;int main(){    int sp[10010];    int n;    while(scanf("%d", &n) != EOF)    {        int k = 0;        for(int i = 1; i*i <= n; ++i)        {            if(n%i==0)            {                sp[k++] = i;                sp[k++] = n/i;            }        }        sort(sp, sp+k);        int fp = 0;        for(int i = 0; i < k; ++i)        {            if(sp[i] > 2)            {                fp = 1;                printf("%d\n", sp[i]-1);                break;            }        }        if(fp==0)            printf("0\n");    }    return 0;}

努力努力...