BSGS算法

给定y、z、p,计算满足yx mod p=z的最小非负整数x。p为质数(没法写数学公式,以下内容用心去感受吧)

x = i*m + j.

y^(j)≡z∗y^(-i*m)) (mod p)

y^(j)≡z∗ine(y^(i*m)) (mod p)(逆元)

由费马小定理y^(p-1)≡1 (mod p) ine(y^m) = y^(p-m-1) 

ine(y^(i*m)≡ine(y^((i−1)m))∗y^(p-m-1)

1.首先枚举同余符号左面,用一个hash保存(y^j,j),因为j可能等于0,所以hash[1]要赋为一个特殊值。

2.再枚举同余符号右面,如果hash(z∗ine(y^(i*m)))存在,就找到了一组解。

显然,m=sqrt(p)的时候复杂度最低为O(sqrt(p)),m=ceil(sqrt(p)).

从这个人博客中可以看出,这个人对于BSGS算法有着相当深刻的理解,居然能够找到俩个有助于学习BSGS算法的俩首歌,还用了exgcd算法。

http://www.cnblogs.com/yuiffy/p/3877381.html

其他俩个操作为快速幂,exgcd。

因为题目并不是一起写的,所以写了俩个快速幂。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
using namespace std; int T,k;
long long y,z,p;
map<int,int> hash; long long q(long long z) {
if(z==) return y%p;
long long m=q(z/);
if(z%) return (((m*m)%p)*y)%p;
return (m*m)%p;
} void solve1() {
printf("%lld\n",q(z));
} long long exgcd(long long a,long long b,long long &x,long long &y) {
if(b==) {
x=; y=;
return a;
}
long long res=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return res;
} void solve2(long long a,long long b,long long n) {
long long x,y,ans,d,s;
d=exgcd(a,n,x,y);
if(b%d!=) printf("Orz, I cannot find x!\n");
else {
ans=(b/d)*x; s=n/d;
ans=(ans%s+s)%s;
printf("%lld\n",ans);
}
} long long power(long long a,long long b,long long mod) {
long long res=;
while(b) {
if(b&) res=res*a%mod;
a=a*a%mod;
b>>=;
}
return res;
} void solve3() {
y%=p; z%=p;
if(!y && !z) printf("1\n");
else if(!y) printf("Orz, I cannot find x!\n");
else {
long long m,v,e,res;
m=ceil(sqrt(p)); v=power(y,p-m-,p); e=; hash.clear();
hash[]=m+;
for(long long i=;i<=m;i++) {
e=e*y%p;
if(!hash[e]) hash[e]=i;
} res=-;
for(long long i=;i<m;i++) {
if(hash[z]) {
res=i*m+(hash[z]==m+?:hash[z]);
break;
}
z=z*v%p;
}
if(res==-) printf("Orz, I cannot find x!\n");
else printf("%d\n",res);
}
} int main() {
scanf("%d%d",&T,&k);
while(T--) {
scanf("%lld%lld%lld",&y,&z,&p);
if(k==) solve1();
else if(k==) solve2(y,z,p);
else solve3();
}
return ;
}

bzoj2242: [SDOI2011]计算器 && BSGS 算法的更多相关文章

  1. bzoj2242: [SDOI2011]计算器 BSGS+exgcd

    你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...

  2. bzoj2242 [SDOI2011]计算器——BSGS

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一次写BSGS,参考了好多好多博客: 然而看到的讲解和模板是一种写法,这道题的网上题 ...

  3. bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记

    这题的主要难点在于第三问该如何解决 于是就要知道BSGS是怎样的一种方法了 首先BSGS是meet in the middle的一种(戳下面看) http://m.blog.csdn.net/blog ...

  4. 【BZOJ2242】[SDOI2011]计算器 BSGS

    [BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...

  5. BZOJ2242 [SDOI2011]计算器 【BSGS】

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4741  Solved: 1796 [Submit][Sta ...

  6. [bzoj2242][Sdoi2011]计算器_exgcd_BSGS

    计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...

  7. bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...

  8. 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器

    说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...

  9. BZOJ2242[SDOI2011]计算器——exgcd+BSGS

    题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...

随机推荐

  1. Mysql几种索引类型的区别及适用情况

    如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE. 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyI ...

  2. 模仿开发H5游戏,看你有多色

    开发记录 前言 之前跟着慕课网学习开发H5小游戏开心鱼,勾起我的兴趣. 在写代码的过程中,不怎么会遇到问题.虽然代码是亲手敲出来的,但是由于并没有对游戏的整体思路,所以并不知道开发与优化的过程. 为了 ...

  3. PHP 中的BOM BUG

    对于PHP,一个小小让我不敢置信的事情很多,包括引用变量哪么迟钝,普通变量哪么牛B我己经很意外,甚至现在竟然出现了BOM头的BUG. 在PHP中,会引用很多小文件,include或require,哪么 ...

  4. QT模态弹出对话框

    QDialog QWidget 默认show()都是非模态 如果需要模态显示, QDialog ==> setModal(true); show(); exec(); QWidget ==> ...

  5. Eclipse maven工程 Missing artifact com.sun:tools:jar:1.5.0:system 解决方法

    今天同事在使用eclipse,引入一个新的maven工程时报错:      Missing artifact com.sun:tools:jar:1.6.0:system   这个问题很奇怪,相同的代 ...

  6. EXT4.2--Ext Designer 使用

    前言: “画EXT”是一个美好的想法,如果有一款可视化工具能够只需进行拖拽而设计EXT,生成代码--那真是一件美丽的事.然而现实是,即使是为Eclipse装上EXT插件,用上idea,手写代码的提示也 ...

  7. 【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛

    组合计数/乘法逆元 排列组合求总方案数 这个可以用一个一维的动态规划解决: f[i][0]表示第i头牛是牝牛的方案数 f[i][1]表示第i头牛是牡牛的方案数 则转移为:f[i][0]=f[i-1][ ...

  8. [转载]Winform开发框架之统计图表的实现

    在前面的一些随笔中,介绍了不少我的Winform框架的特性,上篇随笔<Winform开发框架之通用高级查询模块>对其中的通用高级模块进了一个整理说明,本篇继续介绍Winform开发框架重要 ...

  9. PHP之SQL防注入代码集合(建站常用)

    SQL防注入代码一 <?php if (!function_exists (quote)) { function quote($var) { if (strlen($var)) { $var=! ...

  10. Mac OS X中MacPorts的安装使用备忘

    Mac下面除了用dmg.pkg来安装软件外,比较方便的还有用MacPorts来帮助你安装其他应用程序,跟BSD中的ports道理一样.MacPorts就像apt-get.yum一样,可以快速安装些软件 ...