1319: Sgu261Discrete Roots

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 389  Solved: 172

Description

给出三个整数p,k,a,其中p为质数,求出所有满足x^k=a (mod p),0<=x<=p-1的x。

Input

三个整数p,k,a。

Output

第一行一个整数,表示符合条件的x的个数。 第二行开始每行一个数,表示符合条件的x,按从小到大的顺序输出。

Sample Input

11 3 8

Sample Output

1
2

HINT

2<=p<p<=10^9
 2<=k<=100000,0<=a

【分析】

  

  终于发现原根的用处了!原根的幂构成模p的缩系,即用原根的幂可以表示所有模p下的数。假设模p下的一个原根是g,对于方程x^k=a(%prim) 可以写成(g^i)^k三g^j(%p),那么有g^j=三a(mod p),j可以用BSGS求得,那么i*k三j(%phi[p]),这个可以用exgcd求出所有可行的i,答案为g^i。

代码如下:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define LL long long
#define Maxn 1000010 LL ax,ay;
LL exgcd(LL a,LL b)
{
if(b==) {ax=;ay=;return a;}
LL g=exgcd(b,a%b);
LL xx=ax;
ax=ay;ay=xx-(a/b)*ay;
return g;
} LL np[Maxn];
void div(LL x)
{
np[]=;
for(LL i=;i*i<=x;i++) if(x%i==)
{
np[++np[]]=i;
while(x%i==) x/=i;
}
if(x>) np[++np[]]=x;
} LL qpow(LL x,LL b,LL p)
{
LL xx=x,pp=p,ans=;
while(b)
{
if(b&) ans=(ans*xx)%p;
xx=(xx*xx)%p;
b>>=;
}
return (LL)ans;
} LL ffind(LL p)
{
div(p-);
for(LL i=;i<p;i++)
{
bool ok=;
for(LL j=;j<=np[];j++)
{
if(qpow(i,(p-)/np[j],p)==) {ok=;break;}
}
if(ok) return i;
}
return -;
} LL cnt;
struct node
{
LL id,val;
}t[Maxn]; bool cmp(node x,node y) {return (x.val==y.val)?(x.id<y.id):(x.val<y.val);} LL t_div(LL x)
{
LL l=,r=cnt;
while(l<r)
{
LL mid=(l+r)>>;
if(t[mid].val==x) return t[mid].id;
if(t[mid].val>x) r=mid-;
else l=mid+;
}
if(t[l].val==x) return t[l].id;
return -;
} LL BSGS(LL x,LL c,LL p)
{
t[].id=;t[].val=;
LL sq=(LL)ceil(sqrt((double)p));
for(LL i=;i<=sq;i++) t[i].id=i,t[i].val=(t[i-].val*x)%p;
sort(t,t++sq,cmp);
cnt=;
for(LL i=;i<=sq;i++) if(t[i].val!=t[i-].val) t[++cnt]=t[i]; LL bm=qpow(x,sq,p);
bm=qpow(bm,p-,p);
LL tmp=c;
for(LL i=;i<=sq;i++)
{
LL now=t_div(tmp);
if(now!=-) return i*sq+now;
tmp=(tmp*bm)%p;
}
return -;
} LL op[Maxn]; int main()
{
LL p,k,a;
scanf("%lld%lld%lld",&p,&k,&a);
LL g=ffind(p);
LL C=BSGS(g,a,p);
if(C==-) {printf("0\n");return ;}
C%=p-;
LL d=exgcd(k,p-);
if(C%d!=) {printf("0\n");return ;}
ax*=C/d;
ax=(ax%((p-)/d)+((p-)/d))%((p-)/d); LL ans=qpow(g,ax,p),id=ax,mx=ans,add=qpow(g,(p-)/d,p);
op[]=;
op[++op[]]=ans;
LL fs=ans;
while(add!=)
{
id=ax+((p-)/d);
ans=(ans*add)%p;
if(ans==fs) break;
op[++op[]]=ans;
}
sort(op+,op++op[]);
printf("%lld\n",op[]);
for(LL i=;i<=op[];i++) printf("%lld\n",op[i]);
return ;
}

[BZOJ 1319]

2016-09-07 13:52:58

【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)的更多相关文章

  1. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

    Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...

  2. BZOJ 1420: Discrete Root (原根+BSGS)

    题意 已知kkk, aaa, ppp. 求 xk≡a (mod p)x^k\equiv a\ (mod\ p)xk≡a (mod p) 的所有根. 根的范围[0,p−1][0,p-1][0,p−1]. ...

  3. bzoj 1420 Discrete Root - 原根 - exgcd - BSGS

    题目传送门 戳我来传送 题目大意 给定$k, p, a$,求$x^{k}\equiv a \pmod{p}$在模$p$意义下的所有根. 考虑模$p$下的某个原根$g$. 那么$x  = g^{ind_ ...

  4. BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理

    题目描述 给出三个整数p,k,a,其中p为质数,求出所有满足x^k=a (mod p),0<=x<=p-1的x. 输入 三个整数p,k,a. 输出 第一行一个整数,表示符合条件的x的个数. ...

  5. Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

    我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...

  6. CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)

    题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\ ...

  7. 51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1123.html 题目传送门 - 51Nod1123 题意 $T$ 组数据. 给定 $A,B,C$,求 ...

  8. 51Nod1039 N^3 Mod P 数论 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1039.html 题目传送门 - 51Nod1039 题意 题解 这题我用求高次剩余的做法,要卡常数. ...

  9. 51Nod1038 X^A Mod P 数论 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1038.html 题目传送门 - 51Nod1038 题意 题解 在模质数意义下,求高次剩余,模板题. ...

随机推荐

  1. Java SSL/TLS Socket实现

    通信端无需向对方证明自己的身份,则称该端处于"客户模式",否则称其处于"服务器模式",无论是客户端还是服务器端,都可处于"客户模式"或者&q ...

  2. java ssm框架入门(一)面向接口编程

    因为工作上用到spring + strtus2 + mybatis ,所以开始学习下这个框架. 这里用到的是MySQL数据库 首先从web.xml 开始 <?xml version=" ...

  3. 20151209jquery学习笔记Ajax 代码备份

    /*$(function () { $("input").click(function() { $.ajax({ type:'POST', url:'test.php', data ...

  4. ACM——线性表操作

    线性表操作 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:2795            测试通过:589 描述 线性表是n个元素 ...

  5. MyBatis3.1 学习教程

    昨天中午,突然有想要学习 MyBatis 的冲动,经过 1.5 天的研究和学习,再加上以前学过 I batis 的经验,很快就了解了这门技术. 写这篇教程,是想告诉那些想学却又怕学习不好的同学们, 其 ...

  6. swift 函数返回值

    函数的定义及调用 func开头作为前缀,->返回的类型 add输出结果是11 函数参数也可以有多个参数,写在括号里用逗号隔开. func introduce(name: String,age: ...

  7. 浅谈c#接口的问题,适合新手来了解

    这段时间的项目有用到接口,开始不是特别理解接口,只是单单知道接口定义非常简单,甚至觉得这个接口只是多此一举(个人开发的时候).现在开始团队开发,才发现接口原来是这么的重要和便捷! 接下来就来谈谈我这段 ...

  8. 一些简单的帮助类(1)-- String的类型验证

    在工作中经常会遇到 验证String 中的值是否属于Int型或者是Bool又或是Date 一般的做法是用方法 类型.TryParse(string,类型) 来做验证. "; int intV ...

  9. 05_天气查询_JAX-WS方式_客户端

    [客户端特点] 支持面向对象开发. 客户端功能调用webService,首先得知道WebService的地址. 一般情况下,只要知道了wsdl的地址,就可以知道WebService的地址. 我们上一篇 ...

  10. C++模板学习随笔

    本文学习内容参考:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 1.模板分为函数模板和类模板两种类型 函数模板针 ...