博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
exBSGS板子
阅读量:5254 次
发布时间:2019-06-14

本文共 1305 字,大约阅读时间需要 4 分钟。

/*bzoj2480*/#include #include 
#include
#include
#include
typedef long long LL;std::map
mmp;inline LL Pow(LL x,LL y,LL P){ LL ret=1; while(y){ if(y&1)ret=ret*x%P; x=x*x%P,y>>=1; } return ret;}inline LL gcd(LL x,LL y){ return x==0?y:gcd(y%x,x);}inline LL BSGS(LL A,LL B,LL C,LL D){ int len=ceil(sqrt(C+0.5)); LL temp=B,sum=D; mmp.clear(); for(int i=1;i<=len;++i)mmp[temp=temp*A%C]=i; temp=Pow(A,len,C); for(int i=1;i<=len;++i){ sum=sum*temp%C; if(mmp.count(sum))return i*len-mmp[sum]; } return -1;}inline LL exBSGS(LL A,LL B,LL C){/*A>=0(这里涉及到0^0是否有意义(是否为1),我们假设他是1好了) B>=0 C>0(%0和/0是一个效果啊)*//*假设我们求的解是最小自然数(无解输出-1)*/ if(C==1)return 0; A%=C,B%=C; if(B==1)return 0;/*判掉了解为0的情况*/ if(A==0){ if(B==0)return 1; return -1; }/*现在A>0 B>=0 B!=1 C>1*/ LL D=1;int cnt=0; for(LL g=gcd(A,C);g!=1;g=gcd(A,C)){ if(B%g!=0)return -1; C/=g,B/=g,D=D*(A/g)%C,++cnt; if(D==B)return cnt; }/*得到的C一定不为1*/ A%=C;/*现在我们得到了A的cnt次方与C除去gcd后的结果(分别是D和C),并且现在A与C互质了*/ LL ret=BSGS(A,B,C,D); return ret==-1?-1:ret+cnt;}int main(){ LL a,p,b,ans; while(true){ scanf("%lld%lld%lld",&a,&p,&b); if(p==0)return 0; ans=exBSGS(a,b,p); if(ans==-1)puts("No Solution"); else printf("%lld\n",ans); }}

 

转载于:https://www.cnblogs.com/TSHugh/p/8393161.html

你可能感兴趣的文章
vue route 跳转
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>