HDOJ 4861 Couple doubi

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值