计算器(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

相关文章

一文详解如何在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

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完