bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS
1:快速幂 2:exgcd 3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了......
(map就是慢).....
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#define LL long long
using namespace std;
map<long long,int> pp;
map<long long,bool> bo;
LL a,b,c;
int T,opt;
LL qp(LL a,LL b){
LL ans=1;
while(b){
if(b&1)ans=(ans*a)%c;
a=(a*a)%c;b>>=1;
}return ans;
}
LL gcd(LL x,LL y){return y==0?x:gcd(y,x%y);}
LL exgcd(LL o,LL p,LL &x,LL &y){
if(p==0){x=1;y=0;return o;}
LL gcd=exgcd(p,o%p,x,y);
LL t=x; x=y;
y=t-(o/p)*x;
return gcd;
}
LL exbsgs(LL a,LL b,LL c){
pp.clear();bo.clear();
LL g,d=1,m,now=1;int num=0;
while((g=gcd(a,c))>1){
if(b%g!=0)return -1;
b/=g;c/=g;num++;
d=(d*(a/g))%c;
}
//printf("num==%d\n",num);
m=ceil(sqrt(c));
for(int i=0;i<m;i++){
if(!bo[now]){bo[now]=1;pp[now]=i;}
now=(now*a)%c;
}
for(int i=0;i<=m;i++){
LL x,y,e=exgcd(d,c,x,y);
x=(x*b%c+c)%c;
if(bo[x]) return pp[x]+i*m+num;
d=(d*now)%c;
}
return -1;
}
int main(){
scanf("%d%d",&T,&opt);
if(opt==1){
while(T--){
scanf("%lld%lld%lld",&a,&b,&c);
printf("%lld\n",qp(a,b));
}
}
if(opt==2){
while(T--){
scanf("%lld%lld%lld",&a,&b,&c);
LL x,y;
LL d=exgcd(a,c,x,y);
if(b%d!=0){printf("Orz, I cannot find x!\n");continue;}
x*=b/d;
LL cd=c/d;
x=(x%cd+cd)%cd;
printf("%lld\n",x);
}
}
if(opt==3){
while(T--){
scanf("%lld%lld%lld",&a,&b,&c);
LL ans=exbsgs(a,b,c);
if(ans==-1)printf("Orz, I cannot find x!\n");
else printf("%lld\n",ans);
}
}
return 0;
}
bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS的更多相关文章
- BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )
没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]
2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...
- BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)
污污污污 2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2312 Solved: 917 [Submit][S ...
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- 【bzoj1965】: [Ahoi2005]SHUFFLE 洗牌 数论-快速幂-扩展欧几里得
[bzoj1965]: [Ahoi2005]SHUFFLE 洗牌 观察发现第x张牌 当x<=n/2 x=2x 当x>n/2 x=2x-n-1 好像就是 x=2x mod (n+1) 就好 ...
- bzoj 2242: [SDOI2011]计算器【扩展欧几里得+快速幂+BSGS】
第一问快速幂板子 第二问把式子转化为\( xy\equiv Z(mod P)\rightarrow xy+bP=z \),然后扩展欧几里得 第三问BSGS板子 #include<iostream ...
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
- BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)
同余方程都不会写了..还一直爆int /* 2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元 首先a%p=0时 仅当b=0时有解:然后有x ≡b*a^-1( ...
随机推荐
- was上的应用程序部分启动的原因
最近几天为了方便联调,我把两个项目配置到was测试环境上,前几天还好好的,昨天忽然有一个项目反复安装后都呈现部分启动的状态,打开节点一看,偏偏没启动的那个节点就是我需要用的79节点. 这让我很郁闷,硬 ...
- java虚拟机的类加载机制
引言 我们写的代码是放在.java文件中,经过编译器编译后,转成.class文件.Class文件是一串二进制流,它可以被各平台的虚拟机所接受,实现跨平台. 虚拟机将描述类的数据从class文 ...
- Collections.sort自定义排序的使用方法
Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...
- oracle索引建立和删除
1.多列建立索引 SQL> create index dex_index2 on dex(sex,name); Index created. SQL> select object_name ...
- Mybatis Generator实现分页功能
Mybatis Generator实现分页功能 分类: IBATIS2013-07-17 17:03 882人阅读 评论(1) 收藏 举报 mybatisibatisgeneratorpage分页 众 ...
- MySQL Join 的实现原理
在寻找Join 语句的优化思路之前,我们首先要理解在MySQL 中是如何来实现Join 的,只要理解了实现原理之后,优化就比较简单了.下面我们先分析一下MySQL 中Join 的实现原理.在MySQL ...
- redis资源未释放引发的问题
一.redis资源未释放的起因: N年前,在修改一个古老程序时,不小心把redis释放的这块给干掉了, if (jedis != null) { if (!isInProcess) { jedis.d ...
- JSON数据Key排序
/// <summary> /// JSON格式化重新排序 /// </summary> /// <param name="jobj">原始JS ...
- mybatis源码解读(三)——数据源的配置
在mybatis-configuration.xml 文件中,我们进行了如下的配置: <!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境常用: ...
- Nginx 的安装与配置
一.下载 Linux:CentOS 7.3 64位 Nginx:nginx-1.13.1 安装目录:/usr/local/ wget http://nginx.org/download/nginx-1 ...