BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理
题目描述
输入
输出
样例输入
样例输出
2
提示
2<=p<p<=10^9
2<=k<=100000,0<=a
首先求出$p$的原根$g$,再求出$a$的指标$b$,即$g^b\equiv a(mod\ p)$。我们知道对于$[0,p-1]$中任意数都能用原根的幂次表示,所以将$x$表示成$g^y$即$g^y\equiv x(mod\ p)$,那么原式就变成了$(g^y)^k\equiv g^b(mod\ p)->g^{yk}\equiv g^b(mod\ p)$。根据欧拉定理可知$g^{p-1}\equiv 1(mod\ p)$,所以$yk\equiv b(mod\ (p-1))$,只需要用$exgcd$求出$[0,p-1]$内所有的$y$即可。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll p,k,a;
ll g,f;
ll prime[100010];
int tot;
ll q[100010];
int cnt;
map<ll,int>b;
ll quick(ll x,ll y)
{
ll res=1ll;
while(y)
{
if(y&1)
{
res=res*x%p;
}
y>>=1;
x=x*x%p;
}
return res;
}
ll gcd(ll x,ll y)
{
return y==0?x:gcd(y,x%y);
}
void exgcd(ll A,ll B,ll &x,ll &y)
{
if(!B)
{
x=1;
y=0;
return ;
}
exgcd(B,A%B,y,x);
y-=(A/B)*x;
}
int main()
{
scanf("%lld%lld%lld",&p,&k,&a);
if(!a)
{
printf("1\n0");
return 0;
}
ll m=p-1;
for(int i=2;1ll*i*i<=m;i++)
{
if(m%i==0)
{
prime[++tot]=i;
while(m%i==0)
{
m/=i;
}
}
}
if(m!=1)
{
prime[++tot]=m;
}
for(int i=2;i<=p-1;i++)
{
bool flag=true;
for(int j=1;j<=tot;j++)
{
if(quick(i,(p-1)/prime[j])==1)
{
flag=false;
break;
}
}
if(flag)
{
g=i;
break;
}
}
int n=ceil(sqrt(p));
ll sum=1ll;
for(int i=1;i<=n;i++)
{
(sum*=g)%=p;
b[sum]=i;
}
ll num=1ll;
for(int i=0;i<=n;i++)
{
ll inv=quick(num,p-2);
if(b[inv*a%p])
{
f=i*n+b[inv*a%p];
break;
}
(num*=sum)%=p;
}
ll d=gcd(k,p-1);
if(f%d)
{
printf("0");
return 0;
}
f/=d;
ll X=k/d;
ll Y=(p-1)/d;
ll x,y;
exgcd(X,Y,x,y);
(x*=f)%=(p-1);
x%=Y;
if(x<=0)
{
x+=Y;
}
while(x<=p-1)
{
q[++cnt]=quick(g,x);
x+=Y;
}
sort(q+1,q+1+cnt);
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
printf("%lld\n",q[i]);
}
}
BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理的更多相关文章
- BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 求同余方程x^A=B(mod m)的解个数(原根与指标)
求方程:的解个数 分析:设,那么上述方程解的个数就与同余方程组:的解等价. 设同于方程的解分别是:,那么原方程的解的个数就是 所以现在的关键问题是求方程:的解个数. 这个方程我们需要分3类讨论: 第一 ...
- uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT)
uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT) uoj 题目描述自己看去吧( 题解时间 首先看到 $ p $ 这么小还是质数,第一时间想到 $ lucas $ 定理. 注意 ...
- 【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)
1319: Sgu261Discrete Roots Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 389 Solved: 172 Descriptio ...
- [数论]原根与指标,BSGS
刚学了这方面的知识,总结一下.推荐学习数论方面的知识还是看书学习,蒟蒻看的是<初等数论>学的. 这里也推荐几个总结性质的博客,学习大佬的代码和习题. 原根:https://blog.csd ...
- POJ 1284:Primitive Roots(素数原根的个数)
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5709 Accepted: 3261 Descr ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...
- CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\ ...
随机推荐
- List对象去重碎碎念之神叨叨
前言 List集合操作去除重复数据的这种情况经常会碰到,博客园里面也有很多大神们做过,在这里主要是借鉴然后自己整理了一下,主要是为了方便自己,以后再次碰到这种去重问题,直接打开自己的链接拿起键盘就是干 ...
- ASP.Net Core2.1中的HttpClientFactory系列一:HttpClient的缺陷
引言: ASP.NET Core2.1 中出现了一个新的 HttpClientFactory 功能, 它有助于解决开发人员在使用 HttpClient 实例从其应用程序中访问外部 web 资源时可能遇 ...
- python学习第七篇——字典访问键与值
此程序的目的在于,正确而简单的访问字典的键与值 favorite_languages={ 'jen':['python','c'], 'sarah':['c'], 'edward':['ruby',' ...
- RabbitMQ 安装与使用
RabbitMQ 安装与使用 前言 吃多了拉就是队列,吃饱了吐就是栈 使用场景 对操作的实时性要求不高,而需要执行的任务极为耗时:(发送短信,邮件提醒,更新文章阅读计数,记录用户操作日志) 存在异 ...
- dynamo与cassandra区别
虽说cassandra是dynamo的开源版本,但两者还是有很大区别的. coordinator的选取: 在dynamo论文中,一般是preference list中N个副本的第一个 为什么叫“一般” ...
- 将iso镜像转换为docker镜像
为什么不用官方的镜像? 不是不想使用,而是官方镜像提供的功能实在是太少了,不信的话,你pull一个ubuntu:latest的进行,你看有没有wget.curl.ssh这些功能,就连最简单的ifcon ...
- vue-lazyload简单使用
vue-lazyload简单使用 npm地址:https://www.npmjs.com/package/vue-lazyload github地址:https://github.com/hilong ...
- centos yum install oracle java
How to install Java on CentOS 7 | Linuxizehttps://linuxize.com/post/install-java-on-centos-7/ CentOS ...
- jquery中ajax使用
JQuery的Ajax操作,对JavaScript底层Ajax操作进行了封装, <script type="text/javascript"> $.ajax({ url ...
- Git - 常见错误与解决方案
1.windows使用git时出现:warning: LF will be replaced by CRLF 分析: windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行 ...