a^x=b(mod p)求x,利用分块的思想根号p的复杂度求答案,枚举同余式两端的变量,用hash的方法去找最小的答案(PS:hash看上去很像链式前向星就很有好感)。然后如果p不是质数时,就利用同余式的性质,把(a,p)的最大公约数除掉,然后把残缺的部分用一个d存一下,就可以转化为普通的BSGS了。这里那个在while中的特判b==d要不要我也不确定,加了肯定对。当然一个明确的特判是b==1时这时直接返回答案为0就OK。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#include<algorithm>
#include<vector>
#include<bitset>
#include<set>
#include<cstring>
#include<string>
#define ll long long
#define pb push_back
#define _mp make_pair
#define db double
using namespace std;
const int maxn=100007;
const int maxm=100005;
ll has[maxn];
ll fir[maxn],nxt[maxn],ans[maxn];
int tot;
ll a,b,p;
void add(ll x,ll k)
{
ll p=x%maxn;
ans[++tot]=k;nxt[tot]=fir[p];fir[p]=tot;
has[tot]=x;
}
ll query(ll x)
{
ll p=x%maxn;
for(int i=fir[p];i!=-1;i=nxt[i])
{
if(has[i]==x)return ans[i];
}
return -1;
}
ll bsgs(ll a,ll b,ll p)
{
if(b==1)return 0ll;
ll tmp=1,d=1,cnt=0;
while((tmp=__gcd(a,p))!=1)
{
if(b%tmp)return -1;
b/=tmp;p/=tmp;d=d*(a/tmp)%p;cnt++;
if(b==d)return cnt;//???
}
ll m=ceil(sqrt((double)p));
ll q=1;
for(ll i=0;i<m;i++)
{
add((q*b)%p,i);q=(q*a)%p;
}
for(ll i=m;i<=p+m;i+=m)
{
d=(d*q)%p;
ll tt=query(d);
if(tt!=-1)return i-tt+cnt;
}
return -1;
}
int main()
{
while(scanf("%lld%lld%lld",&a,&p,&b))
{
if(!p&&!a&&!b)return 0;
memset(fir,-1,sizeof(fir));
tot=0;
ll tt=bsgs(a,b,p);
if(tt==-1)printf("No Solution\n");
else printf("%lld\n",tt);
} }

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#include<algorithm>
#include<vector>
#include<bitset>
#include<set>
#include<cstring>
#include<string>
#define ll long long
#define pb push_back
#define _mp make_pair
#define db double
using namespace std;
const int maxn=1000007;
const int maxm=100005;
ll has[maxn];
int fir[maxn],nxt[maxn],ans[maxn];
int tot;
ll a,b,p;
void add(ll x,int k)
{
int p=x%maxn;
ans[++tot]=k;nxt[tot]=fir[p];fir[p]=tot;
has[tot]=x;
}
int query(ll x)
{
int p=x%maxn;
for(int i=fir[p];i!=-1;i=nxt[i])
{
if(has[i]==x)return ans[i];
}
return -1;
}
ll bsgs(ll a,ll b,ll p)
{
if(b==1)return 0ll;
ll m=ceil(sqrt((double)p));
ll q=1,x=1;
for(ll i=0;i<m;i++)
{
add((q*b)%p,i);q=(q*a)%p;
}
x=(x*q)%p;
for(ll i=m;i<=p;i+=m)
{
ll tt=query(x);
if(tt!=-1)return i-tt;
x=(x*q)%p;
}
return -1;
}
int main()
{
while(~scanf("%lld%lld%lld",&p,&a,&b))
{
memset(fir,-1,sizeof(fir));
tot=-1;
ll tt=bsgs(a,b,p);
if(tt==-1)printf("no solution\n");
else printf("%lld\n",tt);
} }

  

  

BSGS+exBSGS POJ2417+POJ3243的更多相关文章

  1. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  2. BSGS&ExBSGS

    BSGS&ExBSGS 求解形如 \[a^x\equiv b\pmod p\] 的高次同余方程 BSGS 假装\(gcd(a,p)=1\). 设\(m=\lceil\sqrt p \rceil ...

  3. [note]BSGS & exBSGS

    BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k ...

  4. 算法笔记--BSGS && exBSGS 模板

    https://www.cnblogs.com/sdzwyq/p/9900650.html 模板: unordered_map<int, int> mp; LL q_pow(LL n, L ...

  5. BSGS && EXBSGS

    基础BSGS 用处是什么呢w 大步小步发(Baby-Step-Giant-Step,简称BSGS),可以用来高效求解形如\(A^x≡B(mod C)\)(C为素数)的同余方程. 常用于求解离散对数问题 ...

  6. 【数论】【ex-BSGS】poj3243 Clever Y

    用于求解高次同余方程A^x≡B(mod C),其中C不一定是素数. http://blog.csdn.net/tsaid/article/details/7354716 这篇题解写得最好. 那啥,这题 ...

  7. Noip前的大抱佛脚----数论

    目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...

  8. 各种友(e)善(xin)数论总集(未完待续),从入门到绝望

    目录 快速幂 扩展欧几里得 GCD 扩展欧几里得 同余系列 同余方程 同余方程组 一点想法 高次同余方程 BSGS exBSGS 线性筛素数 埃式筛 欧拉筛 欧拉函数 讲解 两道水题 法雷级数 可见点 ...

  9. REHの收藏列表

    搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...

随机推荐

  1. unity can't add the script behaviour CallbackExecutor. The script needs ...

    记一次Unity3D小问题 当我打开VS2017编辑完C#脚本,要将脚本拖到一个3D组件上时,发生了以下错误 unity can't add the script behaviour Callback ...

  2. PJProject(2.6) 工程介绍

    pjlib pjlib\build\pjlib.vcproj pjlib_test pjlib\build\pjlib_test.vcproj pjsip_core pjsip\build\pjsip ...

  3. 数据库H2学习

    本文转载自:https://www.cnblogs.com/xdp-gacl/p/4171024.html 一.H2数据库介绍 常用的开源数据库有:H2,Derby,HSQLDB,MySQL,Post ...

  4. Checkpoint 和Breakpoint

    参考:http://www.cnblogs.com/qiangshu/p/5241699.htmlhttp://www.cnblogs.com/biwork/p/3366724.html 1. Che ...

  5. U盘中的快捷方式解析

    很多人都有使用绿色软件的习惯,在这里我简单称其为Portable App 将这些软甲放到U盘中随身携带,便于我们使用更加符合自身习惯的功能软件. 相信习惯将软件放到U盘启动都会碰到一个问题,就是每次打 ...

  6. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  7. Java11新特性!

    Java11又出新版本了,我还在Java8上停着.不过这也挡不住我对他的热爱,忍不住查看了一下他的新性能,由于自己知识有限,只总结了以下八个特性: 1.本地变量类型推断 什么是局部变量类型推断? va ...

  8. 面向对象_classmethod_staticmethod

    classmethod:类方法 主要用于改变静态属性 class Fruit_price: __discount= 1 def __init__(self,original_price): self. ...

  9. springboot项目屏蔽mq或者mongodb的监控日志输出

    最近写项目,用的是springboot,其中用到了rabbitmq和mongodb,配置完成 项目启动后,会输出如下日志: mongodb和mq的检测,会一直打印日志,这样会影响开发人员的测试. 如何 ...

  10. gradle构建项目失败:Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9

    Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to ...