求解A^x ≡ B mod P (P不一定是质数)的最小非负正整数解

先放几个同余定理:

一、判断如果B==1,那么x=0,算法结束

二、若gcd(A,P)不能整除 B,则 无解,算法结束

三、若gcd(A,P)!=1,令d=gcd(A,P),若d不能整除B,则无解,算法结束。

四、持续步骤三,直至 gcd(A,)=1

有 

五、枚举 0<x<k,若有解,输出x,算法结束

六、对于x>=k,

A=,B=,P=

A,P 互素 ,

直接用BSGS 求    * A ^ x ≡ B mod P

所得结果再+k即可

#include<map>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; typedef long long LL; map<int,int>mp; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int get_gcd(int a,int b) { return !b ? a : get_gcd(b,a%b); } int Pow(int a,int b,int mod)
{
int res=;
for(;b;a=1LL*a*a%mod,b>>=)
if(b&) res=1LL*res*a%mod;
return res;
} int ex_BSGS(int A,int B,int C)
{
if(B==) return ;
int k=,tmp=,d;
while()
{
d=get_gcd(A,C);
if(d==) break;
if(B%d) return -;
B/=d; C/=d;
tmp=1LL*tmp*(A/d)%C;
k++;
if(tmp==B) return k;
}
mp.clear();
int mul=B;
mp[B]=;
int m=ceil(sqrt(1.0*C));
for(int j=;j<=m;++j)
{
mul=1LL*mul*A%C;
mp[mul]=j;
}
int am=Pow(A,m,C);
mul=tmp;
for(int j=;j<=m;++j)
{
mul=1LL*mul*am%C;
if(mp.count(mul)) return j*m-mp[mul]+k;
}
return -;
} int main()
{
int A,C,B;
int ans;
while()
{
read(A); read(B); read(C);
if(!A) return ;
ans=ex_BSGS(A,B,C);
if(ans==-) puts("No Solution");
else cout<<ans<<'\n';
}
}

最新文章

  1. 【Win10】UAP/UWP/通用 开发之 x:Bind
  2. c++ 接口和抽象类
  3. jquery 格式化系统时间
  4. yii模块下面的组件
  5. popen使用不当引起产生僵尸进程
  6. 【.Net底层剖析】3.用IL来理解属性
  7. javascript中String的fromCharCode()方法
  8. 从零开始--系统深入学习IOS(使用Swift---带链接)
  9. 洛谷 P1019 单词接龙 Label:dfs
  10. Bootstrap 输入框和导航组件
  11. LeetCode: JumpGame 1 and 2
  12. [原创] Fragment的添加、移除问题
  13. hdu 2480 贪心+简单并查集
  14. 【最大流】【HDU2883】【kebab】
  15. 未能加载文件或程序集 Newtonsoft.Json, Version=4.5.0.0 的报错,解决方法
  16. POJ1135_Domino Effect(最短)
  17. 基于Hadoop开发网络云盘系统客户端界面设计初稿
  18. Gridview导出成Excel
  19. js常见算法
  20. html的基本标记符号

热门文章

  1. Ubuntu(16.04.2)学习笔记(一)如何解决dpkg: error processing install-info
  2. 小程序Promise不支持finally解决方案
  3. F - Set of Strings
  4. [转]xargs命令详解,xargs与管道的区别
  5. C++ socket 传输不同类型数据的四种方式
  6. Linux的7个运行级别
  7. C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)
  8. 【python图像处理】图像的缩放、旋转与翻转
  9. 深入理解CMA【转】
  10. js 数组、对象转json 以及json转 数组、对象