BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)
同余方程都不会写了。。还一直爆int
/*
2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元
首先a%p=0时 仅当b=0时有解;然后有x ≡b*a^-1(mod p),a,p互质,可用快速幂求a的逆元,*b的得到x
但是扩欧还是比快速幂快的
*/
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int MAXIN=1<<17,N=1e5,mod=5e6;
char IN[MAXIN],*SS=IN,*TT=IN;
struct HASH
{
int Enum,H[mod+3],nxt[N],to[N],val[N];
void Init() {memset(H,0,sizeof H), Enum=0;}
inline void AddEdge(int u,int v)
{
int x=u%mod;
for(int i=H[x];i;i=nxt[i])
if(val[i]==u) {to[i]=v; return;}
to[++Enum]=v, val[Enum]=u, nxt[Enum]=H[x], H[x]=Enum;
}
int Query(int u)
{
int x=u%mod;
for(int i=H[x];i;i=nxt[i])
if(val[i]==u) return to[i];
return -1;
}
}hs;
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int Fast_Pow(LL a,int k,int p)
{
LL t=1;
for(;k;k>>=1,a=a*a%p)
if(k&1) t=t*a%p;
return t;
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
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;
}
void Solve2(int a,int b,int p)//calc ax=b(mod p)->ax-py=b
{
int g=gcd(a,p);
if(b%g) {puts("Orz, I cannot find x!"); return;}
int x,y;
Exgcd(a,p,x,y);//calc ax+by=gcd(a,b) or a/=g,b/=g,ax+by=1
x=1LL*x*(b/g)%p;//ax*c/gcd+by*c/gcd=c*gcd/gcd=c
p/=g;
printf("%d\n",(x%p+p)%p);//x=x_0+k*p/g
}
void BSGS(int a,int b,int p)//a^x ≡b(mod p)
{
if(gcd(a,p)!=1) {puts("Orz, I cannot find x!"); return;}
hs.Init();
int m=ceil(sqrt(p-1));
LL t=b%p,AM;
for(int j=0;j<=m;++j) hs.AddEdge(t,j),t=t*a%p;
AM=Fast_Pow(a,m,p),t=AM;
for(int v,i=1;i<=m;++i,t=t*AM%p)
if((v=hs.Query(t))!=-1) {printf("%d\n",(1LL*i*m-v)%p); return;}
puts("Orz, I cannot find x!");
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("2242.in","r",stdin);
#endif
int t=read(),k=read(),a,b,p,x,y;
while(t--)
{
a=read(),b=read(),p=read();
if(k==1) printf("%d\n",Fast_Pow(a,b,p));
else if(k==2) Solve2(a,b,p);
else BSGS(a,b,p);
}
return 0;
}
BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)的更多相关文章
- bzoj 2242: [SDOI2011]计算器【扩展欧几里得+快速幂+BSGS】
第一问快速幂板子 第二问把式子转化为\( xy\equiv Z(mod P)\rightarrow xy+bP=z \),然后扩展欧几里得 第三问BSGS板子 #include<iostream ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
- BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )
没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...
- BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]
2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...
- BZOJ 1965 洗牌(扩展欧几里得)
容易发现,对于牌堆里第x张牌,在一次洗牌后会变成2*x%(n+1)的位置. 于是问题就变成了求x*2^m%(n+1)=L,x在[1,n]范围内的解. 显然可以用扩展欧几里得求出. # include ...
- bzoj 2242 [SDOI2011]计算器(数论知识)
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS
1:快速幂 2:exgcd 3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了...... (map就是慢)..... #include<cstdio> # ...
- [原博客] BZOJ 2242 [SDOI2011] 计算器
题目链接 noip级数论模版题了吧.让求三个东西: 给定y,z,p,计算`Y^Z Mod P` 的值. 给定y,z,p,计算满足`xy≡ Z ( mod P )`的最小非负整数. 给定y,z,p,计算 ...
随机推荐
- 图文并茂的Python教程-numpy.pad
图文并茂的Python教程-numpy.pad np.pad()常用与深度学习中的数据预处理,可以将numpy数组按指定的方法填充成指定的形状. 声明: 需要读者了解一点numpy数组的知识np.pa ...
- Spring的Aspect切面类不能拦截Controller中的方法
根本原因在于<aop:aspectj-autoproxy />这句话是在spring的配置文件内,还是在springmvc的配置文件内.如果是在spring的配置文件内,则@Control ...
- Ex 6_5棋子放置问题_第八次作业
题目貌似有问题 (b) 子问题定义: 设maxValue[i][j]为棋盘的前i行中最后一行为i时第i行按照第j种放置方式放置时得到的最大覆盖值,comp[i][j]为第i种放置方式与第j种放置方式是 ...
- Fiddler模拟post四种请求数据
前言: Fiddler是一个简单的http协议调试代理工具,它界面友好,易于操作,是模拟http请求的利器之一. 在接口测试中,接口通常是get请求或者post请求.get请求的测试一般较为简单,只需 ...
- 一台电脑,两个及多个git账号配置
1. 生成两[三]个ssh公钥私钥 方法参照:http://www.cnblogs.com/fanbi/p/7772812.html第三步骤 假定其中一个是id_rsa, 另一个时id_rsa_two ...
- Python-2d形变 动画 表格
一.形变 /*1.形变参考点: 三轴交界点*/ transform-origin: x轴坐标 y轴坐标; /*2.旋转 rotate deg*/ transform: rotate(720deg); ...
- 大数据处理算法--Bloom Filter布隆过滤
1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bloom Filter(BF)是一种空间效率很 ...
- vue系列之概念
一.模板引擎 通常出现在应用层,即服务器端(MVC层中的view) 客户端HTTP请求->应用层的控制器(Controller)->应用层的服务层(Service,访问数据库)->封 ...
- LeetCode(26): 删除排序数组中的重复项
Easy! 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间 ...
- 区间dp的一些模式和总结
参考博客:https://blog.csdn.net/my_sunshine26/article/details/77141398 https://blog.csdn.net/qq_38569113/ ...