您的位置:首页 > 其它

HDOJ 4861 Couple doubi

2016-07-11 17:09 211 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4861

题意:给我们n个球和一个质数p,求的编号从1~n,编号为i的球的价值为1^i+2^i+3^i+……(p-1)^i mod p,然后两个人轮流开始拿球,直到球拿完,拿完球后谁的价值总和最高谁就赢,问我们先手是否能够获胜。

首先,很容易想到当i为(p-1)的倍数的时候,价值最大为p-1,因为p为质数,根据欧拉-费马定理,i^(φ(p) == p-1) mod p = 1,所以总和就是p-1,也就是最大值。

那么我们再来看i不为(p-1)的倍数的情况,我们设g为p的原根,那么1,2,3,4……p-2,p-1,就可以表示成g^1,g^2,g^3……g^p-1(注意,这里不一定是按顺序对应的),那么我们的价值就变成了g^i*1,g^i*2,g^i*3……g^i*(p-1),那么求和就变成了一个等比数列的求和,所以价值就为(g^i * (g^i*(p-1) - 1) * (g^i - 1)^(p-2)   -- (注意,公式后面的乘(g^i-1)^(p-2)是对等比数列中除以(g^i-1)转换为乘逆元的形式),又因为g^(p-1)
* i等于1,所以价值就一定为0.

所以我们得到了一个结论,那就是如果编号是p-1的倍数,那么价值为1,如果编号不为p-1的倍数,价值就为0,所以如果价值为1的数的个数是奇数,先手就能赢,如果是偶数就不能赢。

#include <cstdio>
typedef long long LL;
int main()
{
LL k,p;
while(scanf("%I64d%I64d", &k,&p) !=EOF)
{
LL tmp = k/(p-1);
if(tmp&1) printf("YES\n");
else printf("NO\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: