BSGS+exBSGS POJ2417+POJ3243
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的更多相关文章
- BSGS&EXBSGS 大手拉小手,大步小步走
大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...
- BSGS&ExBSGS
BSGS&ExBSGS 求解形如 \[a^x\equiv b\pmod p\] 的高次同余方程 BSGS 假装\(gcd(a,p)=1\). 设\(m=\lceil\sqrt p \rceil ...
- [note]BSGS & exBSGS
BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k ...
- 算法笔记--BSGS && exBSGS 模板
https://www.cnblogs.com/sdzwyq/p/9900650.html 模板: unordered_map<int, int> mp; LL q_pow(LL n, L ...
- BSGS && EXBSGS
基础BSGS 用处是什么呢w 大步小步发(Baby-Step-Giant-Step,简称BSGS),可以用来高效求解形如\(A^x≡B(mod C)\)(C为素数)的同余方程. 常用于求解离散对数问题 ...
- 【数论】【ex-BSGS】poj3243 Clever Y
用于求解高次同余方程A^x≡B(mod C),其中C不一定是素数. http://blog.csdn.net/tsaid/article/details/7354716 这篇题解写得最好. 那啥,这题 ...
- Noip前的大抱佛脚----数论
目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...
- 各种友(e)善(xin)数论总集(未完待续),从入门到绝望
目录 快速幂 扩展欧几里得 GCD 扩展欧几里得 同余系列 同余方程 同余方程组 一点想法 高次同余方程 BSGS exBSGS 线性筛素数 埃式筛 欧拉筛 欧拉函数 讲解 两道水题 法雷级数 可见点 ...
- REHの收藏列表
搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...
随机推荐
- C# MessageBox自动关闭
本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭.特别是一些第三方插件(如:dll)弹出的对话框,最为适用.本文仅供学习分享使用,如有不足之处,还请指正. 概述 ...
- MySQL常用命令汇总(偏向运维管理)
基础部分 1. select @@version; ##查询当前mysql的版本. 2. show variables like 'port';##查看mysql实例的端口. 3. show vari ...
- Python第八天 模块 包 全局变量和内置变量__name__ Python path
Python第八天 模块 包 全局变量和内置变量__name__ Python path 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Pyt ...
- JAVA 递归实现从n个数中选取m个数的所有组合
这周Java课程有个小作业:Java递归实现从n个数中选取m个数的所有组合 代码如下: //其中 n 取 1,2,3,4,5 五个数, m 取 3 package javaText; public c ...
- 【Spring】application.xml文件配置
什么是Spring? Spring是分层的javaEE full-stack(一站式)轻量级开源框架. ---注解配置--针对SSM <?xml version="1.0" ...
- sqlserver日期函数大全
一,统计语句 1, - 统计当前[>当天00点以后的数据] SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT ...
- Centos7.5 部署postfix邮件系统
1. Postfix 1.1 邮件服务的介绍 电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务.通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费) ...
- 如何提高 windows 的使用效率?--巧用运行命令
windows 操作系统可以使用 win+R 运行一些命令执行任务,好处是:高效.快速.准确. 启动程序 将程序 chrome 写入以下注册表中, SOFTWARE\Microsoft\Windows ...
- LeetCode算法题-Relative Ranks(Java实现)
这是悦乐书的第248次更新,第261篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第115题(顺位题号是506).根据N名运动员的得分,找到他们的相对等级和得分最高的三个 ...
- 英语口语练习系列-C05-水电
<登幽州台歌>·陈子昂 陈子昂(公元659-公元700年),唐代文学家,初唐诗文革新人物之一. Num 诗句 1 前不见古人, 2 后不见来者. 3 念天地之悠悠, 4 独怆然而涕下! T ...