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. Android为TV端助力(转载)

    作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...

  2. Can't create/write to file '/tmp/MLjnvU95' (Errcode: 13 - Permission denied)

    今天一个同事反馈往一个MySQL数据库导入数据时,报"ERROR 1 (HY000): Can't create/write to file '/tmp/MLjnvU95' (Errcode ...

  3. SQL Server 更新统计信息出现严重错误,应放弃任何可能产生的结果

      一台SQL Server 2008 R2版本(具体版本如下所示)的数据库,最近几天更新统计信息的作业出错,错误如下所示: Microsoft SQL Server 2008 R2 (SP2) - ...

  4. Linux垃圾清理

    一.删除缓存 1,非常有用的清理命令:sudo apt-get autoclean                清理旧版本的软件缓存sudo apt-get clean                ...

  5. LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)

    这是悦乐书的第285次更新,第302篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671).给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树 ...

  6. React.js开发的基本配置(配了两天)

    记录下心酸的过程: 1.安装npm 安装node.js,这时候你就可以使用npm了. 因为官方的源下载npm的包比较慢,所以可以用淘宝的源,这时候使用nrm来进行npm源的切换 在cmd中执行 npm ...

  7. idea spring boot

    1 如何使用IntelliJ IDEA 配置Maven https://blog.csdn.net/westos_linux/article/details/78968012 2.Maven将中央仓库 ...

  8. JAVA常用API的总结(2)

    这篇是常用API的结束了,写完的话可以继续往后复习了. 1.基本类型包装类的介绍与相关代码实现 对于数据包装类的特点就是可以将基本数据类型与字符串来回切换,接下来我会通过介绍Integer类的形式,来 ...

  9. Java线程锁,synchronized、wait、notify详解

    (原) JAVA多线程这一块有点绕,特别是对于锁,对锁机制理解不清的话,程序出现了问题也很难找到原因,在此记录一下线程的执行以及各种锁. 1.JAVA中,每个对象有且只有一把锁(lock),也叫监视器 ...

  10. Django-CRM项目学习(一)-admin组件

    开始今日份整理 1.admin组件使用 1.1 创建django项目以及开启APP01 略 1.2 创建类 使用django自带的sqlite3的小型文件型的数据库 注:使用sqlite3类型的数据库 ...