前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hdu 4861 Couple doubi(数论)

hdu 4861 Couple doubi(数论)

作者头像
全栈程序员站长
发布2022-07-13 15:53:49
1330
发布2022-07-13 15:53:49
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

题目链接:hdu 4861 Couple doubi

题目大意:两个人进行游戏,桌上有k个球,第i个球的值为1i+2i+⋯+(p−1)i%p,两个人轮流取,假设DouBiNan的值大的话就输出YES,否则输出NO。

解题思路: 首先是DouBiNan先取,所以肯定优先选取剩余中值最大的,于是不存在说DouBiNan值小的情况,仅仅有大于和小于。 然后,对于val(i)=1i+2i+⋯+(p−1)i%p来说,仅仅有当i=ϕ(p)=p−1(p为素数)时,val(i)=p−1,其它情况下val(i)=0,那么仅仅要确定说有多少个i是非0的就可以,假设是偶数则输出NO,奇数输出YES。

证明,如果p有原根g,那么1i,2i,…,(p−1)i即是g1∗i,g2∗i,…,g(p−1)∗i的一个排序,由于对于gk来说,k从1到p-1,gk均不同样,而且为1到p-1。 于是val(i)=gi∗(1−gi∗(p−1))1−gi 依据费马小定理,gi∗(p−1)%p=1 所以有val(i)=gi∗(1−1)1−gi=0

  1. p为质数,所以一定有原根
  2. 原根,即gi%p≠gj%p(i≠j且i,j<p)
代码语言:javascript
复制
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;
typedef long long ll;
ll k, p;

int main () {
    while (cin >> k >> p) {
        ll t = k / (p-1);    
        if (t&1)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118365.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档