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. Cookie 获取

    二级域名可以获取一级域名的Cookie值 二级域名下删除顶级域名下的Cookie,需要添加顶级域名的Cookie作用域 /// <summary> /// 根据cookie名称删除 /// ...

  2. html5游戏引擎-Pharse.js学习笔记(一)

    1.前言 前几天随着flappy bird这样的小游戏的火爆,使我这种也曾了解过html5技术的js业余爱好者也开始关注游戏开发.研究过两个个比较成熟的html5游戏引擎,感觉用引擎还是要方便一些.所 ...

  3. struts2传map到前台出现的问题

    后台打印出的错: 2016-08-16 13:42:52.652 WARN  org.apache.struts2.json.JSONWriter     - JavaScript doesn't s ...

  4. 3244: [Noi2013]树的计数 - BZOJ

    Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...

  5. php缓存

    APC缓存退出舞台,APCU诞生,OPCACHE升级! 对于php5.5以后的新版本开发,使用apc习惯的开发者可能会发现php.5.5以后找不到了这个组件的更新,尤其是中文phper都找不到合适的资 ...

  6. 基于 Eclipse 平台的代码生成技术

    ------------------------------------------------------------------ 转自http://www.ibm.com/developerwor ...

  7. Eclipse改变外观,护眼模式

    1.Eclipse改变背景颜色 Windows menu --> Preference General -> Editors -> Text Editors(click),  在右下 ...

  8. 1034-IBM技术俱乐部主席竞选

    描述 今天IBM技术俱乐部举行主席竞选,你的任务是统计谁是得票最多的候选人. 输入 输入数据包含多组测试案例. 每组测试案例由N(0<N<1000)开头,N表示投票总数,后续N行每行包含一 ...

  9. 为Android Studio 项目手动下载gradle

    在http://developer.android.com/samples/index.html上下载的例子,导入Android Studio的时候,第一件事就是下载项目对应版本的gradle.gra ...

  10. QT里使用sqlite的问题,好多坑

    1. 我使用sqlite,开发机上好好的,测试机上却不行.后来发现是缺少驱动(Driver not loaded Driver not loaded),代码检查了又检查,发现应该是缺少dll文件(系统 ...