bzoj2242,洛谷2485----SDOI2011计算器(exgcd,qsm,bsgs模板)
就是一道模板题!
这里再强调一下
BSGS
考虑方程\(a^x = b \pmod p\)
已知a,b,p\((2 \le p\le 10^9)\),其中p为质数,求x的最小正整数解
解法:
注意到如果有解,那么一定满足\(0<x<p\)
设\(t=\lfloor \sqrt p \rfloor\)
那么一定有
\((a^t)^c=ba^d \pmod p\)
此时\(x=ct-d(0 \le d <t)\)
因为$$\frac{a{ct}}{ad} = b \pmod p$$
那么我们预处理一个\(a^d\),因为d的取值只有t个,所以可以先预处理,然后暴力枚举左边,看看有没有合法的解
不多说了
直接上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#include<map>
using namespace std;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
ll n,m;
ll mod;
map<ll,ll> mp;
ll qsm(ll i,ll j)
{
ll ans=1;
while (j)
{
if (j&1) ans=ans*i%mod;
i=i*i%mod;
j>>=1;
}
return ans;
}
ll exgcd(ll &x,ll &y,ll a,ll b)
{
if (b==0)
{
x=1;
y=0;
return a;
}
ll cnt=exgcd(x,y,b,a%b);
ll tmp =x;
x=y;
y=tmp-a/b*y;
return cnt;
}
ll bsgs(ll a,ll b)
{
mp.clear();
if (a%mod==0 && b==0) return 0;
if (a%mod==0 && b!=0) return -1;
//if (a==1 && b!=1) return -1;
//if (a==1 && b==1) return 0;
//==0) return -1;
ll t = ceil(sqrt(mod));
for (ll i=0;i<=t;i++)
{
ll tmp = qsm(a,i)*b%mod;
if (!mp[tmp]) mp[tmp]=i;
}
for (ll c=1;c<=t;c++)
{
ll cnt = qsm(a,c*t)%mod;
if (mp[cnt])
{
//cout<<c*t<<endl;
return c*t-mp[cnt];
}
}
return -1;
}
int main()
{
scanf("%d%d",&n,&m);
if (m==1)
{
for (int i=1;i<=n;i++)
{
ll x,y;
x=read(),y=read(),mod=read();
printf("%lld\n",qsm(x,y));
}
}
if (m==2)
{
for (int i=1;i<=n;i++)
{
ll a,b,c;
ll x=0,y=0;
a=read(),c=read(),b=read();
ll gcd=exgcd(x,y,a,b);
if (c%gcd!=0)
{
printf("Orz, I cannot find x!\n");
continue;
}
ll tmp = b/gcd;
x=x*c/gcd%tmp;
x=(x%tmp+tmp)%tmp;
printf("%lld\n",x);
}
}
//return 0;
if (m==3)
{
for (int i=1;i<=n;i++)
{
ll a,b;
a=read(),b=read(),mod=read();
ll tmp = bsgs(a,b);
if (tmp==-1)
printf("Orz, I cannot find x!\n");
else
printf("%lld\n",tmp);
}
}
return 0;
}
bzoj2242,洛谷2485----SDOI2011计算器(exgcd,qsm,bsgs模板)的更多相关文章
- 洛谷 P2485 [SDOI2011]计算器 解题报告
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
- 洛谷P2485 [SDOI2011]计算器(exgcd+BSGS)
传送门 一题更比三题强 1操作直接裸的快速幂 2操作用exgcd求出最小正整数解 3操作用BSGS硬上 然后没有然后了 //minamoto #include<cstdio> #inclu ...
- [洛谷P2491] [SDOI2011]消防
洛谷题目链接:[SDOI2011]消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超 ...
- BZOJ2243 洛谷2486 [SDOI2011]染色 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2243 题目传送门 - 洛谷2486 题意概括 一棵树,共n个节点. 让你支持以下两种操作,共m次操 ...
- 洛谷 P2495 [SDOI2011]消耗战(虚树,dp)
题面 洛谷 题解 虚树+dp 关于虚树 了解一下 具体实现 inline void insert(int x) { if (top == 1) {s[++top] = x; return ;} int ...
- [洛谷P1495] 曹冲养猪 (中国剩余定理模板)
中国剩余定理(朴素的)用来解线性同余方程组: x≡a[1] (mod m[1]) x≡a[2] (mod m[2]) ...... x≡a[n] (mod m[n]) 定义ms=m[1]*m[2]*. ...
- BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]
2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...
- 【算法学习】【洛谷】树链剖分 & P3384 【模板】树链剖分 P2146 软件包管理器
刚学的好玩算法,AC2题,非常开心. 其实很早就有教过,以前以为很难就没有学,现在发现其实很简单也很有用. 更重要的是我很好调试,两题都是几乎一遍过的. 介绍树链剖分前,先确保已经学会以下基本技巧: ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
随机推荐
- vue 输入框禁止输入空格 ,只能输入数字,禁止输入数字
正则表达式: @input="form.userName = form.userName.replace(/\s+/g,'')" ( 禁止输入空格) @input=&q ...
- JDK1.8源码阅读笔记(1)Object类
JDK1.8源码阅读笔记(1)Object类 Object 类属于 java.lang 包,此包下的所有类在使⽤时⽆需⼿动导⼊,系统会在程序编译期间⾃动 导⼊.Object 类是所有类的基类,当⼀ ...
- 洛谷P2115 Sabotage G 题解
题目 [USACO14MAR]Sabotage G 题解 本蒟蒻又来了,这道题可以用二分答案来解决.我们可以设答案最小平均产奶量为 \(x \ (x \in[1,10000])\) .然后二分搜索 \ ...
- K8S的核心概念
1.Pod -- 是最小部署单元 -- 是一组容器的集合 -- Pod中的容器共享网络 -- 生命周期是短暂的 2.controller -- 确保预期的pod副本的数量 -- 确保所有的node运行 ...
- lua中的sleep实现
这篇文章主要介绍了Lua中实现sleep函数功能的4种方法,本文讲解了在一个死循环中设置一个跳出条件方法.调用系统的sleep函数法.Windows下ping命令法.socket库中select函数法 ...
- 剑指offer计划19( 搜索与回溯算法中等)---java
1.1.题目1 剑指 Offer 64. 求1+2+-+n 1.2.解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱. 这题用了&&当左边为fal ...
- easyx实现小球移动
easyx是一个针对VC++编译器的图形化插件.使用它,可以使得在C++中编写图形程序. 小球移动代码: #include"stdafx.h" #include<graphi ...
- Django学习day13随堂笔记
每日测验 """ 今日考题 1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点 2.基于django中间件的 ...
- 【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚
万事从最基本的开始. 要想完全掌握 NIO,并不是掌握上面文章([死磕NIO]- NIO基础详解)中的三大组件就可以了,我们还需要掌握一些基本概念,如什么是 IO,5 种IO模型的区别,什么是阻塞&a ...
- 利用 g4l 完整备份和还原Linux系统
前言: 1.Windows中Ghost由于一系列原因,有不支持分区格式,因此可能无法完整备份Linux. 2.g4l = Ghost for Linux 1.下载g4l https://sourcef ...