BSGS ! x
一.引入:
若存在一个式子a^b ≡ c (mod p) (p ≡ 1000000007,且0<a,b,c<p)
已知a,b,求c.
这不就是快速幂嘛!
已知a,c,求b.
这就是我们需要研究的问题!用到了BSGS!
题目链接:poj 2417 bsgs
二.概念
BSGS:
又名大步小步算法.具体的我也不清楚啦~
那么发明来做什么事情呢?
如上所述:
就是用来求解a^x ≡ b (mod p)这样的式子
PS:已知a,b,p
求最小x
三.做法
首先,我们将x用i*m-j来表示,其中我们的m=seil(sqrt(p)),(seil为向上取整)
然后我们用i*m-j代替掉x,所以原式就变成了这个样子
a^(i * m-j) ≡ b (mod p)
又因为a^(i * m-j) => a^(i * m)/a^j
所以原式又变了模样:
a^(i * m)/a^j ≡ b (mod p)
又因为在"≡"(同余号)的两侧同时乘以一个相同的数依旧是成立的,如果不明白可以手动模拟一下,
给出个栗子~
3 ≡ 10 (mod 7),当两边同乘以5时式子变成: 15 ≡ 50 (mod 7)
因为15%7==1&&50%7==1,所以原式依旧成立
所以将式子两边同时乘以a^j
那么式子就又发生了改变:
a^(i * m) ≡ b * a^j (mod p)
= (a^m)^i ≡ b * a^j (mod p)
所以问题就简单多了!
因为a^m是常数,b是常数,p也是常数,所以只有 i 跟 j 是未知的,暴力枚举!
但是有一点是我们不能够忘记的:
m的取值范围:1 —— p(p是当b==0时),所以
首先将 j 从1 到 p-1 进行枚举一遍,求出b * a^j 的值丢到hash(大佬是用map做的)里面咯(讲真hash不会用...怪我咯?)
思路是这样的:(其实就是hash啦~)
(b*a^j)%p(如果p太小换成另外一个比较大的质数)作为下标,里面存着当前计算出来的数,以及当前的 j (可以用vector~)
然后,枚举 j ,我们大可以设a^m==c
将 i 从 1 到p-1枚举一遍,如果求出的数在hash里面找到了,则说明当前的数就是 i (能够成立的) 最小值,跳出循环,用当前的i,以及记录下来的 j 计算对应的 i 求出 x
则x就是最小的解
C++代码实现:
(map方法:)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<cmath> using namespace std;
typedef long long LL; LL a,b,c;
map<LL,LL> mp; LL qsm(LL m)
{
LL n = a; if(m == ) return ; LL t = qsm(m/); t = 1LL*t*t%c;
if(m&) t = 1LL*t*n%c; return t;
} int main()
{
//a^im=b*a^j(mod c)
while (scanf("%lld%lld%lld",&c,&a,&b)!=EOF)
{
mp.clear(); //清空
if (a%c==) //判断a,c 是否互质,因为c 是质数,所以直接判断是否整除即可
{
printf("no solution\n");
continue;
}
LL m=ceil(sqrt(c));
LL ans;
for (LL j=; j<=m; j++)
{
if (j==)
{
//当j=0时,a^j=1, b*a^j=b
ans=b%c;
mp[ans]=j;
continue;
}
ans=(ans*a)%c;
//括号里的ans指a^(j-1)*b,(a^(j-1)*b)*a=(a^j)*b
mp[ans]=j;//在((a^j)*b)%c的位置记录下j
}
LL t=qsm(m);//t=a^m
ans=;
bool p=false;
for (LL i=; i<=m; i++)
{
ans=(ans*t)%c;//括号里的ans指的是((a^m)^(i-1))*(a^m)=(a^m)^i=a^(im)
if (mp[ans])
{
LL t=i*m-mp[ans];//t=x,因为我们设的x=i*m-j
printf("%lld\n",t);
p=true;
break;
}
}
if (!p)
printf("no solution\n");
}
}
End.
BSGS ! x的更多相关文章
- 【POJ 3243】Clever Y 拓展BSGS
调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- BSGS[bzoj2242][bzoj3122]
数论题. 操作一:直接快速幂就好了. 操作二:我用了exgcd,shy和lyz都喜欢欧拉函数...QAQ最后这块还写错了. 对于ax+by=gcd(a,b)的形式,我们可以把他们变成y'x+p'y=1 ...
- 【BZOJ2242】【SDoi2011】计算器 快速幂+EXGCD+BSGS
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)
污污污污 2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2312 Solved: 917 [Submit][S ...
- bzoj 1467: Pku3243 clever Y 扩展BSGS
1467: Pku3243 clever Y Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 小 ...
- BSGS模版 a^x=b ( mod c)
kuangbin的BSGS: c为素数: #define MOD 76543 int hs[MOD],head[MOD],next[MOD],id[MOD],top; void insert(int ...
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
- 【poj3358】消因子+BSGS 或 消因子+欧拉定理 两种方法
题意:给你一个分数,求它在二进制下的循环节的长度,还有第一个循环节从哪一位开始. For example, x = 1/10 = 0.0001100110011(00110011)w and 0001 ...
随机推荐
- 【Manacher】Colorful String
The value of a string s is equal to the number of different letters which appear in this string. You ...
- hdu 6375 度度熊学队列 (链表模拟)
度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣. 初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作. ①1 u w val 在编号为 u 的队列里加入一个 ...
- Luogu4022 CTSC2012熟悉的文章(广义后缀自动机+二分答案+动态规划+单调队列)
对作文库中的串建出广义SAM,然后显然可以二分答案,二分之后考虑暴力dp,设f[i]为前i位最长匹配长度,显然有f[i]=max(f[i-1],f[j]+i-j) (i-j>=l&&am ...
- ASP.NET全局编码和语言
// /*--------------- // // 使用地方:ASP.NET 项目 // // // // 文件名: // // 文件功能描述:可控制整个项目的一个统一编码格式和语言文字显示 ...
- C#多线程的简单理解
一.CLR线程池基础 创建和销毁线程是一个昂贵的操作,所以CLR管理了一个线程池(thread pool),可以将线程池看成一个黑盒. CLR初始化时,线程池中是没有线程的.线程的初始化与其他线程一样 ...
- 前端关于 superSlide.js 使用,一款基于jquery的前端控件
1引用jQuery.js 和 jquery.SuperSlide.js 2 编写HTML ** 以下是默认的HTMl结构,分别是 ".hd" 里面包含ul, ".bd&q ...
- 学HTML第二晚 登录框的制作
进天来弄个登录框 首先,登录框要有登录的账号.密码.和确定.取消的,密码也是要隐藏的. 然后,我们就做: 这是理想中的样子,有了想法,就开始写了 <!dotcype html> <h ...
- Java 之 Hashtable 集合
Hashtable 集合 java.util.Hashtable<K,V>集合 implements Map<K,V>接口 Hashtable:底层也是一个哈希表,是一个线 ...
- Java 之 可变参数
可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式: 修饰符 返回值类型 方法名(参数类型... 形参名){ } 其实这个书写完全等价 ...
- elementUI .native修饰符
用第三方组件或者UI框架会自带自身封装的事件,如keyup等,会覆盖原生的组件而无法起效果 .native 修饰符就是用来注册元素的原生事件而不是组件自定义事件的 如elementUI的:<el ...