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. mysql 备份还原数据库

    备份和还原都在bin目录下操作 1.备份 mysqldump -u 用户名 -p 密码  --default-character-set=utf8  数据库名称 >d:/temp.sql 2.还 ...

  2. hbuilder用自己的服务

    2016-03-10 以后写测试demo用Sublime3 http://docs.emmet.io/cheat-sheet/ 更多炫酷信息和emmet语法请参见: 视频demo 语法文档 2016- ...

  3. mysql常见问题

    Q:ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.111' (61)A: 找到my.cnf,把#bind-addres ...

  4. C#的垃圾回收机制及弱引用

    在上一篇中,讨论了字符串常量的拘留池和不可变性:对于字符串变量,没有这个特性(或其他DotNet的非托管资源),当我们使用完后就要手动回收,即将变量的值指向null(p=null),然而堆内存中,那个 ...

  5. CSS3 transition-timing-function

    CSS3 transition-timing-function 属性 定义和用法 transition-timing-function 属性规定过渡效果的速度曲线. 该属性允许过渡效果随着时间来改变其 ...

  6. asp.net:录入数据库的中文变问号

    表格是可以接受中文的: 类型也是nvarchar的: 还是出现写中文变问号?? 这时候请加入转义大写N: 如: 原查询语句:insert into table1(name)  values('蜘蛛侠' ...

  7. C# 中使用win32函数 GetScrollInfo返回false 返回引用全是零的问题

    最近做一个项目要获得ScrollBar的位置,因为.net找不到此类功能,只好用MFC中的函数了,GetScrollPos只返回listview顶部的位置,此时我找到了GetScrollInfo,觉得 ...

  8. 国庆第三天2014年10月3日10:21:39,Nutz,WebCollector,jsoup

    (1)做得好,做得快,只能选择一样. (2)时间过得很快,你没法在假期的一天里完成更多的计划.假期全部由自己支配,相对长一点的睡眠,新加入的娱乐(视频或者游戏),你不比在工作中更有效率. (3)每天练 ...

  9. [工具]toolbox_graph基本操作

    toolbox_graph提供了对3D模型的一些操作.MATLAB代码源自:http://www.mathworks.com/matlabcentral/fileexchange/5355-toolb ...

  10. ASP.NET缓存 Cache

    缓存介绍 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论多 ...