离散对数的求解(bsgs)
bsgs算法
主要用来解决${A^x} = B(\bmod C)$(c是质数),都是整数,已知A、B、C求x。
例:poj 2417 Discrete Logging
具体步骤如下:
先把$x = i*m - j$,其中$m = ceil(\sqrt C )$,(ceil是向上取整)。
这样原式就变为${A^{(i*m - j)}} = B(\bmod C)$,
再变为${A^j}*B = {A^{(m*i)}}(\bmod C)$。
枚举j(范围0-m),将${A^j}*B$存入hash表
枚举i(范围1-m),从hash表中寻找第一个满足${A^j} * B = {A^{(m * i)}}(\bmod C)$。
此时$x = i*m - j$即为所求。
在网上看到的其他题解大多用的是$x = i*m + j$,也可以做,只是会牵扯的求逆元,所以比较麻烦。使$x=i*m-j$就可以轻松避免这个问题了。
那么肯定有人会有疑问为何只计算到$m = ceil(\sqrt C )$就可以确定答案呢?
$x = i*m - j$ 也就是x 的最大值不会超过p,那超过p的怎么办 ?
有一个公式 ${a^{k\bmod (p - 1)}} = {a^k}(\bmod p)$ 这个公式的推导需要用到费马小定理
$k\bmod p - 1$可以看做 $k - m*(p - 1)$ ,原式可化成 ${a^k}/{({a^{(p - 1)}})^m} = {a^k}(\bmod p)$
根据费马小定理 ${a^{(p - 1)}} = 1(\bmod p)$其中p为质数 ,a,p 互质,可得${a^k}/{1^m} = {a^k}(\bmod p){a^k} = {a^k}(\bmod p)$得证
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
ll q=,a=,yy,y2,m,ans,t;
map<ll,int>mp;
ll mod_pow(ll x,ll n,ll mod){
ll res=;
while(n>){
if(n&) res=res*x%mod;
x=x*x%mod;
n>>=;
}
return res;
} int main(){
while(~scanf("%lld%lld",&yy,&y2)){
mp.clear();
m=ceil(sqrt(q));
for(ll i=;i<=m;i++){
if(i==){
ans=yy%q;
mp[ans]=i;
continue;
}
ans=ans*a%q;
mp[ans]=i;
}
bool flag=false;
ans=;
t=mod_pow(a,m,q); for(int i=;i<=m;i++){
ans=ans*t%q;
if(mp[ans]){
ll temp=i*m-mp[ans];
ll rr=mod_pow(y2,temp,q);
printf("%lld\n",rr);
flag=true;
break;
}
}
if(!flag){
printf("No Solution\n");
}
}
return ;
}
离散对数的求解(bsgs)的更多相关文章
- 「算法笔记」BSGS 与 exBSGS
一.离散对数 给定 \(a,b,m\),存在一个 \(x\),使得 \(\displaystyle a^x\equiv b\pmod m\) 则称 \(x\) 为 \(b\) 在模 \(m\) 意义下 ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...
- Luogu4884 多少个1?(BSGS)
11……1(n个)=99……9(n个)/9=(10n-1)/9. 那么显然就是求离散对数了,BSGS即可. #include<iostream> #include<cstdio> ...
- BSGS及其扩展
目录 定义 原理 朴素算法 数论分块 例题 Luogu2485 [SDOI2011]计算器 题解 代码 扩展 例题 Luogu4195 [模板]exBSGS/Spoj3105 Mod 代码 之前写了一 ...
- 【解高次同余方程】51nod1038 X^A Mod P
1038 X^A Mod P 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 X^A mod P = B,其中P为质数.给出P和A B,求< P的所有X. 例如:P = 11 ...
- Discrete Log Algorithms :Baby-step giant-step
离散对数的求解 1.暴力 2.Baby-step giant-step 3.Pollard’s ρ algorithm …… 下面搬运一下Baby-step giant-step 的做法 这是在 ht ...
- 一些数论概念与算法——从SGU261谈起
话说好久没来博客上面写过东西了,之前集训过于辛苦了,但有很大的收获,我觉得有必要把它们拿出来总结分享.之前一直是个数论渣(小学初中没好好念过竞赛的缘故吧),经过一道题目对一些基础算法有了比较深刻的理解 ...
- Baby-step giant-step算法
写在前面: 学习笔记,方便复习,学习资料来自网络,注明出处 我们都在努力奔跑,我们都是追梦人 结论 In group theory, a branch of mathematics, the baby ...
- BSGS求解离散对数问题
离散对数问题是求解axΞb mod(n) 同余方程 以下模板使用于gcd(a,n)=1的情况 ; int hs[mod],head[mod],Next[mod],id[mod],top; void i ...
随机推荐
- [转载]java读写word文档,完美解决方案
做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出. 在网上找了很多解决方案都不太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介 ...
- PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
向mysql 插入数据时,很多时候我们想知道刚刚插入数据的id,这对我们很有用.下面这篇文章就详细给大家介绍了利用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID,有需要的朋友 ...
- O(logn)的意思
T=K*log2(N) 注:2是小2时间T与以2为底的对数成正比.实际上,由于所有的对数都和其他对数成比例(从底数为2转换到底数为10需乘以3.322),我们可以将这个为常数的底数也并入K.由此不必指 ...
- tensorflow中有向图(计算图、Graph)、上下文环境(Session)和执行流程
计算图(Graph) Tensorflow是基于图(Graph)的计算框架,图的节点由事先定义的运算(操作.Operation)构成,图的各个节点之间由张量(tensor)来链接,Tensorflow ...
- java多线程 生产者消费者案例-虚假唤醒
package com.java.juc; public class TestProductAndConsumer { public static void main(String[] args) { ...
- LeetCode Reverse String II
原题链接在这里:https://leetcode.com/problems/reverse-string-ii/#/description 题目: Given a string and an inte ...
- java程序员图文并茂细说Unity中调用Android的接口
http://bbs.csdn.net/topics/391876421 最近做一个项目,为同事提供接口,能使他在Unity中调用Android中的函数来实现QQ登陆并获取用户信息.按照一些书上和一些 ...
- Tomcat 工作原理 1 (转)
Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...
- Js里头的对象字面量
JavaScript 对象字面量 在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ) ...
- [转]理解$watch ,$apply 和 $digest --- 理解数据绑定过程
原文地址:http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/ 注 这篇博文主要是写给新手的,是给那些刚刚开始 ...