【模板】exBSGS/Spoj3105 Mod

题目描述

已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\)。

输入输出格式

输入格式:

每个测试文件中最多包含\(100\)组测试数据。

每组数据中,每行包含\(3\)个正整数\(a,p,b\)。

当\(a=p=b=0\)时,表示测试数据读入完全。

输出格式:

对于每组数据,输出一行。

如果无解,输出No Solution(不含引号),否则输出最小自然数解。


BSGS

若\(A \perp p\),那么\(\{A^x,x\le \varphi(p)\}\)遍历的剩余系\(\{A^{kx},x\le \varphi(p)\}\)一定也遍历,于是考虑枚举答案

\[A^x\equiv B \pmod p
\]

采用分块的思想,设\(t=\sqrt p,x=kt-b\),式子就变成了

\[A^{kt-b}\equiv B \pmod p
\]

\[A^{kt}\equiv A^bB\pmod p
\]

我们枚举\(x=0 \sim t\),然后把得到的\(A^xB\)插到\(\tt{Hash}\)表中去。

然后枚举\((A^t)^k\)的\(k\),查询\(\tt{Hash}\)表中有没有\(A^{kt}\)

exBSGS

如果\(p\)不是质数,存在无解的判定\((\gcd(A,p)\nmid B)\)且\(B\not=1\)(\(B=1\)特判\(x=0\))

然后考虑操作一波式子

\[A^x\equiv B \pmod p,d=\gcd(A,p)
\]

把\(d\)除掉

\[A^{x-1}\frac{A}{d}\equiv \frac{B}{d}\pmod {\frac{p}{d}}
\]

设\(C=\frac{A}{d},B'=\frac{B}{d},p'=\frac{p}{d}\)

原方程变为

\[CA\equiv B' \pmod {p'}
\]

然后重复是否无解的判断并向下递归,直到\(A\perp p\)或者无解

然后\(BSGS\)即可,而常数\(C\)并不影响我们进行\(BSGS\)

复杂度?显然递归的深度是\(\log\)的,带上BSGS的就可以了。

Code:

#include <cstdio>
#include <cmath>
#include <unordered_map>
std::unordered_map <int,int> Hash;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
#define mul(a,b,p) (1ll*(a)*(b)%p)
int exbsgs(int A,int B,int p)
{
if(B==1) return 0;
int ct=0,d,k=1;
while((d=gcd(A,p))^1)
{
if(B%d) return -1;
B/=d,p/=d,++ct;
k=mul(k,A/d,p);
if(k==B) return ct;
}
int t=sqrt(p)+1,kt=1;
Hash.clear();
for(int i=0;i<t;i++)
{
Hash[mul(kt,B,p)]=i;
kt=mul(kt,A,p);
}
k=mul(k,kt,p);
for(int i=1;i<=t;i++)
{
if(Hash.find(k)!=Hash.end()) return i*t-Hash[k]+ct;
k=mul(k,kt,p);
}
return -1;
}
int main()
{
int a,p,b;
scanf("%d%d%d",&a,&p,&b);
while(a&&p&&b)
{
int ans=exbsgs(a,b,p);
if(~ans) printf("%d\n",ans);
else puts("No Solution");
scanf("%d%d%d",&a,&p,&b);
}
return 0;
}

2018.12.19

【模板】exBSGS/Spoj3105 Mod的更多相关文章

  1. P4195 【模板】exBSGS/Spoj3105 Mod

    传送门 首先要懂得 $BSGS$,$BSGS$ 可以求出关于 $Y$ 的方程 $X^Y \equiv Z (mod\ mo)$ 的最小解,其中 $gcd(X,Z)=1$ $exBSGS$ 算是 $BS ...

  2. 【BZOJ1467/2480】Pku3243 clever Y/Spoj3105 Mod EXBSGS

    [BZOJ1467/2480]Pku3243 clever Y/Spoj3105 Mod Description 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. Input      ...

  3. 【bzoj2480】Spoj3105 Mod

    2480: Spoj3105 Mod Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 557  Solved: 210[Submit][Status][ ...

  4. BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)

    我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...

  5. spoj3105 MOD - Power Modulo Inverted(exbsgs)

    传送门 关于exbsgs是个什么东东可以去看看yyb大佬的博客->这里 //minamoto #include<iostream> #include<cstdio> #i ...

  6. BZOJ2480 Spoj3105 Mod 数论 扩展BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2480.html 题目传送门 - BZOJ2480 题意 已知数 $a,p,b$ ,求满足 $a^x≡b ...

  7. 模板BSGS(SDOI2011计算器) 模板EXBSGS

    BSGS和EXBSGS是OI中用于解决A^xΞB(mod C)的常用算法. 1.BSGS BSGS用于A,C互质的情况. 令m=sqrt(C),此时x可表示为i*m+j. 式中i和j都<=sqr ...

  8. [luogu4195 Spoj3105] Mod (大步小步)

    传送门 题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入输出格式 输入格式: 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a ...

  9. BZOJ2480 Spoj3105 Mod

    乍一看题面:$$a^x \equiv b \ (mod \ m)$$ 是一道BSGS,但是很可惜$m$不是质数,而且$(m, a) \not= 1$,这个叫扩展BSGS[额...... 于是我们需要通 ...

随机推荐

  1. Table 组件构建过程中遇到的问题与解决思路

    在 GearCase 开源项目构建 Table 组件的过程中.遇到了各式各样的问题,最后尝试了各种方法去解决这些问题. 遇到的部分问题 checkbox 的全选和半选问题 table 组件的排序请求方 ...

  2. [T-ARA/超新星][TTL (Time To Love)]

    歌词来源:http://music.163.com/#/song?id=5403002 作曲 : 金道勋 [作曲 : 金道勋] 作词 : Rhymer/Joosuc/황성진 [作词 : Rhymer/ ...

  3. Less 的用法

    1. node.js node.js是一个前端的框架 自带一个包管理工具npm node.js 的安装 官网:http://nodejs.cn/ 在命令行检验是否安装成功 切换到项目目录,初始化了一个 ...

  4. virtual box下安装ubuntu经验

    1. 哪怕下载的是ubuntu64位版本,也在vitualbox下选择ubuntu而不要选择ubuntu(64bit) 2. 安装VBoxGuestAdditional.iso:下载和vbox版本相匹 ...

  5. shell--read命令

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...

  6. python如何与以太坊交互并将区块链信息写入SQLite

    关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀.因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物.今天我们将观察 ...

  7. iOS - Bundle 资源文件包生成和常见资源文件使用

    1.Bundle 文件 Bundle 文件,就是资源文件包.我们将许多图片.XIB.文本文件组织在一起,打包成一个 Bundle 文件.方便在其他项目中引用包内的资源. Bundle 文件是静态的,也 ...

  8. 微信小程序——音阶练耳 宣传页面

    音阶练耳是什么? 音阶练耳小程序是一款听音练习音阶,拥有简介界面的交互式小程序,以虚拟钢琴为辅助乐器,应用于日常练习,涵盖了五个八度内26种调式.以及下行中的所有调式与和声小调式的衍生,提高辨认音阶的 ...

  9. First Blood

    自我介绍 大家好!我的名字是戴俊涵,代号211606359,喜欢看电影和古风音乐,也是一个资深漫迷(让世界感受痛楚吧),喜欢的美食是牛排. 回想初衷 (1)回想一下你初入大学时对本专业的畅想 当初你是 ...

  10. 09慕课网《进击Node.js基础(一)》HTTP-get/request

    get是对request封装 可以在后台发起http请求,获取远程资源,更新或者同步远程资源 http.request(options[,callback]) 以下代码灌水失败: var http = ...