当前位置: 首页 > news >正文

【文文殿下】ExBSGS

无需逆元版本:

#include<cstdio>
#include<cassert>
#include<cmath>
#include<map>
typedef long long ll;
ll gcd(ll a,ll b) {
    return b?gcd(b,a%b):a;
}
ll qpow(ll a,ll b,ll p) {
    ll ret = 1;
    while(b) {
        if(b&1) {
            ret=ret*a%p;
        }
        a=a*a%p;
        b>>=1;
    }
    return ret;
}
ll exgcd(ll a,ll b,ll &x,ll &y) {
    if(b==0) {
        x=1;y=0;
        return a;
    }
    ll d = exgcd(b,a%b,x,y);
    ll tmp = x;
    x = y;
    y=tmp-a/b*y;
    return d;
}
inline ll bsgs(ll a,ll b,ll p) {
    std::map<ll,ll> M;
    if(p==1) return 0;
    a%=p;b%=p;
    ll d,cnt=0,q=1;
    while((d=gcd(a,p))!=1) {
        if(b==1) return cnt;
        if(b%d) return -1;
        b/=d;
        p/=d;
        ++cnt;
        q=a/d*q%p;
    }
    ll lmt = ceil(sqrt(p));
    ll tmp = b%p;
    for(int i = 0;i<lmt;++i,tmp=tmp*a%p) {
        M[tmp]=i;
    }
    tmp = qpow(a,lmt,p);
    for(int i = 1;i<=lmt+1;++i) {
        q=q*tmp%p;
        if(M.count(q)) {
            return i*lmt-M[q]+cnt;
        }
    }
    return -1;
}
int main() {
    ll a,b,p;
    scanf("%lld%lld%lld",&a,&p,&b);
    while(a||b||p) {
        ll ans = bsgs(a,b,p);
        if(ans==-1) puts("No Solution");
        else printf("%lld\n",ans);
        scanf("%lld%lld%lld",&a,&p,&b);
    }
    return 0;
}

转载于:https://www.cnblogs.com/Syameimaru/p/10221311.html

相关文章:

  • [HNOI2008]Cards
  • Facebook 2018 年度开源回顾:新增开源项目 153 个
  • 游戏开发中的抛物线(贝塞尔曲线)
  • Vue UI框架库开发介绍
  • MultipartFile 不能直接 转成File对象
  • react native 包学不包会系列--react native开发基础知识
  • 老鼠的商议
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • Silverlight 1.1架构图
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • MDSF:DSL(Domain Specific Language)介绍
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • oracle 调用存储过程和方法
  • Solr:Schema设计
  • C# Finalize和Dispose的区别
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android优雅地处理按钮重复点击
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • express + mock 让前后台并行开发
  • Facebook AccountKit 接入的坑点
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript 基础知识 - 入门篇(一)
  • Java编程基础24——递归练习
  • Python - 闭包Closure
  • SpriteKit 技巧之添加背景图片
  • 阿里云购买磁盘后挂载
  • 第2章 网络文档
  • 对象引论
  • 官方解决所有 npm 全局安装权限问题
  • 时间复杂度与空间复杂度分析
  • 用element的upload组件实现多图片上传和压缩
  • 源码安装memcached和php memcache扩展
  • 责任链模式的两种实现
  • 第二十章:异步和文件I/O.(二十三)
  • 进程与线程(三)——进程/线程间通信
  • ​卜东波研究员:高观点下的少儿计算思维
  • #{} 和 ${}区别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (12)Linux 常见的三种进程状态
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (九)c52学习之旅-定时器
  • (十三)Flask之特殊装饰器详解
  • (转)重识new
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • /*在DataTable中更新、删除数据*/
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [.NET]桃源网络硬盘 v7.4
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BJDCTF2020]The mystery of ip