题目

求最小的正整数 \(x\) 满足 \(g^{ax+b}\equiv c\pmod p\)

其中 \(p\) 是一个质数, \(g,a,b,c\leq 10^{1000000},p\leq 2^{31}\)


分析

先将 \(g^a\)和 \(g^b\) 用费马小定理求出来,

问题就转换成 \(b'\times {a'}^x\equiv c'\pmod p\)

这个直接套用 BSGS 就可以了


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#define rr register
using namespace std;
const int p=70001; typedef long long lll;
const int N=1000011; char A[N],B[N],C[N],G[N];
lll mod,lA,lB,lC,ans,lG,a,b,c,g;
struct Linked_Hash{
struct node{int y,w,next;}E[p]; int Et,hs[p];
inline void Clear(){Et=0,memset(hs,-1,sizeof(hs));}
inline void Insert(int w,int x){E[++Et]=(node){x,w,hs[w%p]},hs[w%p]=Et;}
inline signed locate(int W){
for (rr int i=hs[W%p];~i;i=E[i].next)
if (E[i].w==W) return E[i].y;
return -1;
}
}ha;
inline lll gcd(lll x,lll y){return y?gcd(y,x%y):x;}
inline lll exBSGS(lll a,lll c,lll b,lll mod){
ha.Clear();
rr lll GCD=gcd(a,mod),t=1;
rr lll CNT=0,ir=sqrt(mod)+1;
while (GCD>1){
if (b%GCD||c%GCD) return -1;
b/=GCD,c/=GCD,mod/=GCD,
t=t*(a/GCD)%mod,
GCD=gcd(a,mod),++CNT;
if (b==t*c%mod) return CNT;
}
rr lll now=1;
for (rr int i=0;i<ir;++i)
ha.Insert(now*b%mod,i),now=now*a%mod;
a=now,now=t;
if (!a) return !b?1:-1;
for (rr int i=0;i<=ir;++i){
rr int j=ha.locate(now*c%mod);
if (j>=0&&i*ir+CNT>j) return i*ir+CNT-j;
now=now*a%mod;
}
return -1;
}
inline lll ksm(lll x,lll y){
rr lll ans=1;
for (;y;y>>=1,x=x*x%mod)
if (y&1) ans=ans*x%mod;
return ans;
}
signed main(){
scanf("%s%s%s%s%lld",A+1,B+1,C+1,G+1,&mod);
lA=strlen(A+1),lB=strlen(B+1),lC=strlen(C+1),lG=strlen(G+1);
for (rr int i=1;i<=lG;++i) g=(g*10+G[i]-48)%mod;
for (rr int i=1;i<=lC;++i) c=(c*10+C[i]-48)%mod;
for (rr int i=1;i<=lA;++i) a=(a*10+A[i]-48)%(mod-1);
for (rr int i=1;i<=lB;++i) b=(b*10+B[i]-48)%(mod-1);
a=ksm(g,a),b=ksm(g,b),ans=exBSGS(a,b,c,mod);
if (ans==-1) printf("no solution");
else printf("%lld",ans);
return 0;
}

#费马小定理,BSGS#BZOJ 3285 离散对数解指数方程的更多相关文章

  1. bzoj 3285 离散对数解指数方程

    /************************************************************** Problem: 3285 User: idy002 Language: ...

  2. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 123   Solved: 73 [ Submit][ St ...

  3. BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)

    题目链接 \(Description\) 给定N,G,求\[G^{\sum_{k|N}C_n^k}\mod\ 999911659\] \(Solution\) 由费马小定理,可以先对次数化简,即求\( ...

  4. 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,“至少”一词可以给我们提示,我们可以枚举 ...

  5. bzoj 1951 lucas crt 费马小定理

    首先假设输入的是n,m 我们就是要求m^(Σ(c(n,i) i|n)) mod p 那么根据费马小定理,上式等于 m^(Σ(c(n,i) i|n) mod  (p-1)) mod p 那么问题的关键就 ...

  6. BZOJ 3240 [Noi2013]矩阵游戏 ——费马小定理 快速幂

    发现是一个快速幂,然而过不去. 怎么办呢? 1.十进制快速幂,可以用来练习卡时. 2.费马小定理,如果需要乘方的地方,可以先%(p-1)再计算,其他地方需要%p,所以需要保存两个数. 然后就是分类讨论 ...

  7. hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)

    题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3.                  ...

  8. nyoj1000_快速幂_费马小定理

    又见斐波那契数列 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 斐波那契数列大家应该很熟悉了吧.下面给大家引入一种新的斐波那契数列:M斐波那契数列. M斐波那契数列 ...

  9. poj 3734 Blocks 快速幂+费马小定理+组合数学

    题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...

  10. 数论初步(费马小定理) - Happy 2004

    Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2 ...

随机推荐

  1. 深入解析Python并发编程的多线程和异步编程

    本文分享自华为云社区<Python并发编程探秘:多线程与异步编程的深入解析>,作者:柠檬味拥抱. 在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别 ...

  2. 任务系统之API子任务

    日常运维工作中有许多的任务要执行,例如项目发布/数据备份/定时巡检/证书更新/漏洞修复等等,大部分的任务都会有多个步骤共同完成,例如一个发布任务会有拉代码.编译.分发.通知等等步骤,而不同的任务可能还 ...

  3. 视觉slam十四讲CH4 ---李群与李代数求导

    视觉slam十四讲 ---CH4 李群与李代数求导 李群与李代数相较于CH3是比较的抽象的数学知识,这个工具的提出目的是解决一些旋转位姿描述的优化问题.本讲最终的目的是解决如何描述对旋转求导的问题. ...

  4. Windows NFS 真弱 → 中文乱码导致文件找不到

    开心一刻 正睡着觉,然后来了个电话 对方说:你好,方便面是吗 我愣了一下,以为是恶作剧 回了句:我不是,我是火腿肠! 就挂了电话 又躺了好一会,忽然琢磨过来...... 不对呀,她好像说的是:你好,方 ...

  5. centos 7与8修改主机名的各种方法

    hostname 查看当前系统主机名,知道当前主机名为localhost 当然在centos7特地添加了hostnamectl命令查看,修改主机名 使用hostnamectl set-hostname ...

  6. 牛客周赛34(A~E)

    A 两种情况 两个字符相同只有2 两个字符不相同4 #include <bits/stdc++.h> #define int long long #define rep(i,a,b) fo ...

  7. Vue前端项目架构梳理

    撰写日期:2020-07-23 撰稿人:彭成刚 转载需经本人同意. Vue前端项目架构梳理 后期可以将TypeScript加入到项目来,对参数的数据类型进行更严格的校验. 现在主流就 Vue 和 Re ...

  8. get 加 header 下载文件 函数,虽然最后没用。

    export const apiDown = (url, data = {}) => { let data2 = secretFilter(data) axiosDown({ url, para ...

  9. pandas DataFrame内存优化技巧:让数据处理更高效

    Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力.灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱. 然而,随着数据量的不断增长,如何高效.合理 ...

  10. (二)Linux环境的学习环境的搭建

    Xshell的安装和连接 由于我们打算通过Xshell进行命令的输入,就不再进行VMWARE-TOOLS的安装. 我们直接进行安装Xshell 并开始连接我们创建的创建的虚拟机 我们可以通过Xshel ...