数学:拓展BSGS

当C不是素数的时候,之前介绍的BSGS就行不通了,需要用到拓展BSGS算法
方法转自https://blog.csdn.net/zzkksunboy/article/details/73162229

典型例题是POJ3243
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct Hashmap
{
static const int Ha=,maxe=;
int E,lnk[Ha],son[maxe+],nxt[maxe+],w[maxe+];
int top,stk[maxe+];
void clear() {E=;while (top) lnk[stk[top--]]=;}
void Add(int x,int y) {son[++E]=y;nxt[E]=lnk[x];w[E]=0X7fffffff;lnk[x]=E;}
bool count(int y)
{
int x=y%Ha;
for (int j=lnk[x];j;j=nxt[j])
if (y==son[j]) return true;
return false;
}
int& operator [] (int y)
{
int x=y%Ha;
for (int j=lnk[x];j;j=nxt[j])
if (y==son[j]) return w[j];
Add(x,y);stk[++top]=x;return w[E];
}
}f;
int gcd(int a,int b)
{
return b==?a:gcd(b,a%b);
}
int exgcd(int a,int b,int &x,int &y)
{
if(b==) {x=;y=;return a;}
int r=exgcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*y;
return r;
}
int exBSGS(int A,int B,int C)
{
if(C==) if(B==) return A!=; else return -;
if(B==) if(A!=) return ; else return -;
if(A%C==) if(B==) return ; else return -;
int r,D=,num=;
while((r=gcd(A,C))>)
{
if(B%r) return -;
num++;
B/=r;C/=r;D=((long long)D*A/r)%C;
}
for(int i=,tmp=;i<num;i++,tmp=((long long)tmp*A)%C)
if(tmp==B) return i;
int m=ceil(sqrt(C)),Base=;f.clear();
for(int i=;i<=m-;i++)
{
f[Base]=min(f[Base],i);
Base=((long long)Base*A)%C;
}
for(int i=;i<=m-;i++)
{
int x,y,r=exgcd(D,C,x,y);
x=((long long)x*B%C+C)%C;
if(f.count(x)) return i*m+f[x]+num;
D=((long long)D*Base)%C;
}
return -;
}
int main()
{
int A,B,C;
while(scanf("%d%d%d",&A,&C,&B)==)
{
if(!A&&!B&&!C) break;
int ans=exBSGS(A,B,C);
if(ans==-) printf("No Solution\n");
else printf("%d\n",ans);
}
return ;
}
给哈希好评,哪天好好整理一下
数学:拓展BSGS的更多相关文章
- 【POJ 3243】Clever Y 拓展BSGS
调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...
- 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)
什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...
- [拓展Bsgs] Clever - Y
题目链接 Clever - Y 题意 有同余方程 \(X^Y \equiv K\ (mod\ Z)\),给定\(X\),\(Z\),\(K\),求\(Y\). 解法 如题,是拓展 \(Bsgs\) 板 ...
- 【SPOJ】Power Modulo Inverted(拓展BSGS)
[SPOJ]Power Modulo Inverted(拓展BSGS) 题面 洛谷 求最小的\(y\) 满足 \[k\equiv x^y(mod\ z)\] 题解 拓展\(BSGS\)模板题 #inc ...
- 数学:BSGS
先来稍微回顾一下,我们已经会求模线性方程(包括其特殊情况乘法逆元) 我们还会进行幂取模的快速算法(模是质数用费马小定理,模一般情况用欧拉定理) 对于幂中指数特别大的情况,我们还延伸出了拓展欧拉定理来解 ...
- bzoj4517: [Sdoi2016]排列计数--数学+拓展欧几里得
这道题是数学题,由题目可知,m个稳定数的取法是Cnm 然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m) 错排公式:D[i]=(i-1)*(D[i-1]+ ...
- 【POJ3243】拓展BSGS(附hash版)
上一篇博文中说道了baby step giant step的方法(简称BSGS),不过对于XY mod Z = K ,若x和z并不互质,则不能直接套用BSGS的方法了. 为什么?因为这时候不存在逆元了 ...
- 【POJ3243】【拓展BSGS】Clever Y
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
- 【HDU2815】【拓展BSGS】Mod Tree
Problem Description The picture indicates a tree, every node has 2 children. The depth of the nod ...
随机推荐
- Python为什么会打印两个\
在Python里面,如果\后面不是一个合法的转移字符,那么,Python会打印两个\,换句话说,Python将\也当成普通字符看待,而不是转义符的标志: >>>S = 'C:\py\ ...
- 关于智能指针类型shared_ptr的计数问题
一.关键 每个shared_ptr所指向的对象都有一个引用计数,它记录了有多少个shared_ptr指向自己 shared_ptr的析构函数:递减它所指向的对象的引用计数,如果引用计数变为0,就会销毁 ...
- UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...
- 软工实践Alpha冲刺(1/10)
队名:我头发呢队 组长博客 作业博客 张杰(组长) 过去两天完成了哪些任务 查阅Python爬取音源的资料,如 Python3爬虫抓取网易云音乐热评实战 Python爬取高品质QQ音乐(2) 如何爬网 ...
- 福大软工1816:Alpha(7/10)
Alpha 冲刺 (7/10) 队名:Jarvis For Chat 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.完成 ...
- centOS6.5如何从启动界面直接进入命令行界面
进入系统后,按Ctrl+Alt+Fn可以切换控制台,其中F1~F6是字符控制台,F7~F12是X控制台 如果启动直接进入字符控制台,而不是X Window,可以编辑/etc/inittab将id:5: ...
- mysql的my.cnf配置文件
[client]port = 3306default-character-set=utf8mb4socket = /var/run/mysqld/mysql.sock# user=david# pas ...
- Python使用又拍云进行第三方文件拉取
在爬虫过程中,需要将图片或其他文件进行存储到云上,但在下载图片时,看官方文档,貌似需要先下载到后再上传又拍云,感觉效率很低下.经查找资料实现Python直接对第三方资源进行文件拉取操作,即不需要下载到 ...
- 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)
线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题. 实现同步机制有两个方法:1.同 ...
- RPC-原理及RPC实例分析
还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...