计算器(BSGS,快速幂,exgcd)

2023-10-22 11:40
文章标签 快速 bsgs 计算器 exgcd

本文主要是介绍计算器(BSGS,快速幂,exgcd),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个题目坑啊,查来查去,排查了好久,发现自己快速幂写错了。。。

这个题目有三个询问

1、 yz y z mod m o d p p

2、xy z(mod z ( m o d p) p ) (求x)

3、 yxz(mod y x ≡ z ( m o d p) p ) (求x)

第一个用快速幂求。

第二个就是裸的ecgcd,见 同余方程

前两个是35分

第三个就是裸的BSGS 详见他人博客(鸣谢)

bbb

三个任务分别对应solve1,solve2,solve3

#include <bits/stdc++.h>
using namespace std ;#define rep(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define REP(i,a,b) for (int (i)=(a);(i)>=(b);(i)--)
#define Rep(i,x)   for (int (i)=head[x];(i);i=next[i])#define lowbit(x) ((x)&(-(x)))
#define sqr(x) ((x)*(x))
#define clr(a) memset((a),0,sizeof((a)))
#define ls ((x)<<1)
#define rs ((x)<<1|1)
#define mid (((l)+(r))>>1)
//#define mp make_pair
#define pb push_back
#define fi first
#define se secondtypedef long long ll ;ll n,k,y,z,p  ;
map<ll,ll> mp;map<int,int>a;
ll ksm(ll a,ll b,int p){ll res=1;for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;return res;
}ll exgcd(ll a,ll b,ll &x,ll &y){if (b==0){x=1;y=0;return a ;}ll ans=exgcd(b,a%b,y,x) ;y-=x*(a/b) ;return ans ;
}void solve1(ll y,ll z,ll p){printf("%lld\n",ksm(y,z,p)) ;return  ;
}void solve2(ll yy,ll zz,ll p){if (yy==0 && zz!=0){printf("Orz, I cannot find x!\n") ;return  ;}ll x,y ;ll t=exgcd(yy,p,x,y) ;if (zz%t){printf("Orz, I cannot find x!\n") ;return  ;}x=((zz/t*x%p)+p)%(p/t);printf("%lld\n",x) ;return  ;
}void solve3(ll x,ll z,ll mod){map<int,int>a;ll k=1,y=z%mod;x%=mod;if(!x&&!z){puts("1");return ;}if(!x){printf("Orz, I cannot find x!\n");return ;}ll m=ceil(sqrt(mod-1));ll ni=ksm(x,m,mod);ni=ksm(ni,mod-2,mod);a.clear();a[1]=m+1;for(ll j=1;j<m;j++){k=k*x%mod;if(!a[k]) a[k]=j;}for(ll i=0;i<m;i++){ll u=a[y];if(u){if(u==m+1) printf("%lld\n",i*m);else printf("%lld\n",i*m+u);return ;}y=y*ni%mod;}printf("Orz, I cannot find x!\n");
}
int main(){while(scanf("%lld%lld",&n,&k)!=EOF){rep(i,1,n){ll y,z,p ;scanf("%lld%lld%lld",&y,&z,&p) ;if (k==1) solve1(y,z,p) ;else if (k==2) solve2(y,z,p) ;else solve3(y,z,p) ;}} 
}

这篇关于计算器(BSGS,快速幂,exgcd)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/261216

相关文章

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2