当前位置: 代码迷 >> 综合 >> HDOJ 4861 Couple doubi
  详细解决方案

HDOJ 4861 Couple doubi

热度:43   发布时间:2023-12-06 03:21:00.0

题目链接: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");}
}