2018.12.18 bzoj2242: [SDOI2011]计算器(数论)
传送门
数论基础题。
对于第一种情况用快速幂,第二种用exgcdexgcdexgcd,第三种用bsgsbsgsbsgs
于是自己瞎yyyyyy了一个bsgsbsgsbsgs的板子(不知道是不是数据水了没卡如果有找出错的希望指正谢谢)
下面谈谈我对这个方法的理解。
实际上跟网上说的差不多。
要解ax≡bmod  pa^x\equiv b\mod pax≡bmodp
相当于令p=k∗A+B,0≤B<pp=k*A+B,0\le B<pp=k∗A+B,0≤B<p
然后假设x=k′∗A+B′,0≤B′<px=k'*A+B',0\le B'<px=k′∗A+B′,0≤B′<p
那么(aA)k′≡b∗(a−1)B′(a^A)^{k'}\equiv b*(a^-1)^{B'}(aA)k′≡b∗(a−1)B′
于是枚举k′k'k′和B′B'B′即可,可以想到在AAA取sqrtpsqrt_psqrtp的时候最坏复杂度最优。
代码:
#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
inline int ksm(int a,int p,int mod){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline int gcd(int a,int b){while(b){int t=a;a=b,b=t%a;}return a;}
inline void exgcd(int a,int b,int&x,int&y){
if(!b){x=1,y=0;return;}
exgcd(b,a%b,x,y);
int t=x;
x=y,y=t-a/b*y;
}
inline int bsgs(int a,int b,int mod){
a%=mod,b%=mod;
if(!a&&!b)return 1;
if(!a)return -1;
tr1::unordered_map<int,int>S;
int sqr=ceil(sqrt(mod-1)),inv=ksm(a,mod-2,mod);
for(ri i=0,mul=b;i<sqr;++i,mul=(ll)mul*inv%mod)if(!S[mul])S[mul]=i?i:sqr;
a=ksm(a,sqr,mod);
for(ri i=0,mul=1;i*sqr<=mod;++i,mul=(ll)mul*a%mod)if(S[mul])return i*sqr+(S[mul])%sqr;
return -1;
}
int main(){
freopen("lx.in","r",stdin);
for(ri a,b,p,tt=read(),k=read();tt;--tt){
a=read(),b=read(),p=read();
if(k==1){cout<<ksm(a%p,b,p)<<'\n';continue;}
if(k==2){
a%=p,b%=p;
int g=gcd(a,p),x,y;
if(b%g){puts("Orz, I cannot find x!");continue;}
a/=g,b/=g,p/=g,exgcd(a,p,x,y),x=((ll)b*x%p+p)%p,cout<<x<<'\n';
continue;
}
int tmp;
if(~(tmp=bsgs(a,b,p)))cout<<tmp<<'\n';
else puts("Orz, I cannot find x!");
}
return 0;
}
2018.12.18 bzoj2242: [SDOI2011]计算器(数论)的更多相关文章
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- [bzoj2242][Sdoi2011]计算器_exgcd_BSGS
计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...
- BZOJ2242 [SDOI2011]计算器 【BSGS】
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4741 Solved: 1796 [Submit][Sta ...
- 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器
说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...
- BZOJ2242[SDOI2011]计算器——exgcd+BSGS
题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...
- 【数学 BSGS】bzoj2242: [SDOI2011]计算器
数论的板子集合…… Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最 ...
- BZOJ2242 [SDOI2011]计算器
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj2242: [SDOI2011]计算器 BSGS+exgcd
你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...
- [bzoj2242][SDOI2011][计算器] (Baby-Step-Giant-Step+快速幂+exgcd)
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
随机推荐
- 大数据入门推荐 - 数据之巅 大数据革命,历史、现实与未来等五本PDF
扫码时备注或说明中留下邮箱付款后如未回复请至https://shop135452397.taobao.com/联系店主
- python:django
====启动django==== python manager.py runserver --host 0.0.0.0 --port 9008 python manager.py runserver ...
- 使用pyqt写了一个检查大数据环境的gui
通过pyqt做了一个大数据最佳实践检查的gui界面 1.首先是需要用到的模块 from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets ...
- echarts中间有字饼图Demo1
echarts链接:http://gallery.echartsjs.com/editor.html?c=xHy2vIPzLQ 代码: option = { backgroundColor: 'bla ...
- RSA加密原理使用方式签名验证
RSA加密原理使用方式签名验证 加密是网络传输中非常重要的一环,它保证了信息的安全性,让他人无法通过抓包来获取通讯的信息也无法通过伪造信息而实现对系统的入侵.其中最为常用的信息传递加密方式就是RS ...
- day 20 类与类之间的关系,继承2
类与类之间的关系: 依赖关系 关联关系 聚合关系 组合关系 依赖关系: 大象与冰箱的例子 # 依赖关系,冰箱依赖大象打开 class Elephant: def __init__(self,name) ...
- vue tab切换
<template> <div class="box"> <ul> <li v-for="(item,index) in arr ...
- WebApi中Swagger的使用(超级简单)
Swagger解释 Swagger是一种Rest API的简单但强大的表示方式,她是标准的与语言无关,这种表示方式不但人可读,而且机器可读. 可以作为Rest API的交互式文档,也可以作为Rest ...
- C# oracle to_date 日期型 参数传值
C#操作oracle,date字段,使用参数传值 例子一,获取三小时前的记录 public static DataTable Query() { const string sSql = &qu ...
- 右手坐标系下LookAt视图矩阵的推导
基本知识 右手坐标系 右手手掌弯曲,手指方向由正X轴指向正Y轴,如果这时Z轴正方向与大拇指方向保持一致,坐标系为右手坐标系,否则为左手坐标系. 向量叉乘的方向 向量(1,0,0)与向量(0,1,0)叉 ...