求:$a^{bx \%p}\equiv 1(\mod p)$ 的一个可行的 $x$.

根据欧拉定理,我们知道 $a^{\phi(p)}\equiv 1(\mod p)$

而在 $a^x\equiv 1(\mod p)$ 这个式子中 $x$ 是存在很多个解的.

这些解之间存在着循环节,使得任意解 $x$ 可以被表示成循环节的倍数.

我们设这个循环节为 $cir$.

由于已知 $\phi(p)$ 一定是一个可行解,所以最小循环节一定是 $\phi(p)$ 的约数.

然后我们就可以对 $\phi(p)$ 进行质因数分解来求这个最小循环节 $cir$.

求出来 $cir$ 后,可得 $bx\%p=cir\times y$

你发现因为有这个 $\%p$ 操作,所以会导致这个方程解不出来.

但是好在我们发现,左面那个式子可以变为 $bx+pk=l$,而这个 $l$ 可以被表示为 $i\times gcd(b,p)$

故我们可以将式子变为 $i\times gcd(b,p)=y\times cir$.

然后我们可以对这个求最小通解(因为如果最小解小于 $p$,则一定可以被 $bx\%p$ 表示出来,而且满足 $x\leqslant p-1$ )

这个最小通解是 $c=\frac{cir\times gcd(b,p)}{gcd(gcd(b,p),cir)}$

然后用 exgcd 求一下 $bx+pk=c$ 的 $x$ 的最小正整数解就可以了.

这里可以证明一下为什么只要存在 $bx+pk=c$ 就能保证 $x<p$:

我们可以将 $x$ 表示成 $p+d$ 的形式,那么原式为 $b(p+d)+pk=c$

$\Rightarrow bp+bd+pk=c$

$\Rightarrow b\times d+p\times (k+d)=c$

所以,一旦 $x>p$,我们就可以将一些部分导到 $p\times k$ 那里,以此来实现 $x<p$

#include <string>
#include <ctime>
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 10000060
#define ll long long
using namespace std;
void setIO(string s) {
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
int H=0;
int fr[N];
int prime[N],vis[N],phi[N];
int answer[N];
int MN[N];
struct data {
int a,b,p,id;
data(int a=0,int b=0,int p=0,int id=0):a(a),b(b),p(p),id(id){}
};
vector<data>G[N];
inline int qpow(int x,int y,int mod) {
int tmp=1;
while(y) {
if(y&1) {
tmp=(ll)tmp*x%mod;
}
x=(ll)x*x%mod;
y>>=1;
}
return tmp;
}
int exgcd(int a,int b,int &x,int &y) {
if(!b) {
x=1,y=0;
return a;
}
int gcd=exgcd(b,a%b,x,y);
int tmp=x;
x=y,y=tmp-(a/b)*y;
return gcd;
}
void Linear_shaker() {
int i,j,cnt=0;
fr[1]=1;
for(i=2;i<N;++i) {
if(!vis[i]) {
prime[++cnt]=i;
phi[i]=i-1;
fr[i]=1;
}
for(j=1;j<=cnt&&prime[j]*i<N;++j) {
vis[i*prime[j]]=1;
if(i%prime[j]) {
phi[i*prime[j]]=phi[i]*(prime[j]-1);
fr[i*prime[j]]=i;
}
else {
fr[i*prime[j]]=i;
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
}
int main() {
// setIO("mod");
Linear_shaker();
int i=0,j=0,t1,t2,tp=0;
int a,b,p,Mx=0,k;
while(scanf("%d",&a)!=EOF) {
scanf("%d%d",&b,&p);
++i;
++tp;
if(__gcd(a,p)!=1) {
answer[i]=-1;
}
else {
Mx=max(Mx,phi[p]);
G[phi[p]].push_back(data(a,b,p,i));
MN[i]=phi[p];
int w=phi[p],tmp,c=1;
while(w!=1) {
while(w!=1&&qpow(a,fr[w]*c,p)==1) {
w=fr[w];
}
tmp=w/fr[w];
while(w%tmp==0&&w!=1) {
c*=tmp;
w/=tmp;
}
}
MN[i]=c;
}
}
for(i=1;i<=Mx;++i) {
for(j=0;j<G[i].size();++j) {
a=G[i][j].a;
b=G[i][j].b;
p=G[i][j].p;
int x=0,y=0;
int id=G[i][j].id;
int delta=MN[id];
int gcd=__gcd(p,b);
int tmp=(1ll*gcd*delta)/(__gcd(gcd,delta));
if(tmp>=p) {
answer[id]=-1;
}
else {
gcd=exgcd(b,p,x,y);
x=(1ll*x*(tmp/gcd)%(p/gcd)+(p/gcd))%(p/gcd);
answer[id]=x;
}
}
}
for(i=1;i<=tp;++i) printf("%d\n",answer[i]);
return 0;
}

  

模拟赛 T1 费马小定理+质因数分解+exgcd的更多相关文章

  1. hdu6440 Dream 2018CCPC网络赛C 费马小定理+构造

    题目传送门 题目大意: 给定一个素数p,让你重载加法运算和乘法运算,使(m+n)p=mp+np,并且 存在一个小于p的q,使集合{qk|0<k<p,k∈Z} 等于集合{k|0<k&l ...

  2. 【2018 ICPC焦作网络赛 G】Give Candies(费马小定理+快速幂取模)

    There are N children in kindergarten. Miss Li bought them N candies. To make the process more intere ...

  3. 【2018 CCPC网络赛】1003 - 费马小定理

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6440 这题主要是理解题意: 题意:定义一个加法和乘法,使得 (m+n)p = mp+np; 其中给定 ...

  4. HDU6440 Dream 2018CCPC网络赛-费马小定理

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面.  给定一个素数p ...

  5. HDU6440 Dream(费马小定理+构造) -2018CCPC网络赛1003

    题意: 给定素数p,定义p内封闭的加法和乘法,使得$(m+n)^p=m^p+n^p$ 思路: 由费马小定理,p是素数,$a^{p-1}\equiv 1(mod\;p)$ 所以$(m+n)^{p}\eq ...

  6. 数论初步(费马小定理) - Happy 2004

    Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2 ...

  7. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...

  8. HDU 1098 Ignatius's puzzle 费马小定理+扩展欧几里德算法

    题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为 ...

  9. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

随机推荐

  1. 面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“

    通常在初始化 HashMap 时,初始容量都是根据业务来的,而不会是一个固定值,为此我们需要有一个特殊处理的方式,就是将预期的初始容量,再除以 HashMap 的装载因子,默认时就是除以 0.75. ...

  2. sql server 2019 & spark

    https://cloudblogs.microsoft.com/sqlserver/2019/04/01/how-to-develop-and-submit-spark-jobs-to-sql-se ...

  3. HTTP之缓存是如何保持副本的新鲜的!

    缓存保持副本的新鲜 ========================摘自<HTTP权威指南>================================= 可能不是所有已缓存副本都与服 ...

  4. SpringCloud入门概述

    SpringCloud入门概述 Spring的三大模块:SpringBoot(构建),Spring Cloud(协调),Spring Cloud Data Flow(连接)注意:Spring Boot ...

  5. Docker私有云管理平台————Docker Shipyard

    一.shipyard中文版安装(CentOS) 注:本文安装操作均在root用户下,安装前需先安装Docker (传送门) 下载所需docker镜像 docker pull rethinkdb doc ...

  6. IScroll Unable to preventDefault inside passive event listener due to target being treated as passive

    最近两天企业微信下IScroll突然无法滚动了,特别慢,之前好好的,发现主要是有红色的Unable to preventDefault inside passive event listener du ...

  7. vue样式绑定、事件监听、表单输入绑定、响应接口

    1.样式绑定 操作元素的 class 列表和内联样式是数据绑定的一个常见需求.因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼接麻烦且易错 ...

  8. Dart面向对象编程(二)

    继承: person.dart: class Person{ String name; int age; String _birthday; bool get isAdult => age &g ...

  9. 使用Ueditor上传图片到图片服务器(二)

    上一篇主要写了前端部分如何配置ueditor的上传路径,已经jsp页面中如何使用ueditor的编辑器功能以及如何配置单独的图片上传功能. 这一篇,我分两部分:第一部分是搭建图片服务器以及配置ftp上 ...

  10. C#中的 ?/?:/?? 三者的区别及用法

    在项目的搭建过程中不经意间看到一个关于以上标题三个符号的代码,于是留心记录一下,以备不时之需: 1. 可空类型修饰符(?): 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.    ...