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\)节点,并 ...
随机推荐
- springgateway
SpringGateAway: 先进行鉴权,然后进行路由,日志什么等等
- rabbitMq可靠性投递之手动ACK
#手动应答#spring.rabbitmq.listener.simple.acknowledge-mode=manual#spring.rabbitmq.listener.simple.acknow ...
- jquery mobile cdn
<head> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jque ...
- How to check type of files without extensions in python? 不通过文件扩展名,怎样知道文件类型?
有一个命令 file 可以用 $ file fuck fuck.png: PNG image data, 1122 x 750, 8-bit colormap, non-interlaced pyth ...
- openresty lua-resty-string md5 sha aes random string
安装 https://github.com/openresty/lua-resty-string $ sudo opm get openresty/lua-resty-string $ ls -al ...
- rsync 服务搭建
rsync 服务搭建 服务端部署操作内容: 创建rsync用户和用户组 eg: useradd -s /sbin/nologin -M rsync 创建需要备份的指定目录,并修改权限 eg: mkdi ...
- windows/linux 页面编码区别导致 python 乱码
http://blog.csdn.net/haiross/article/details/36189103 可以先看下这篇文章..写的比较用心和详细并且高深..我只是记流水账的. 直到今天我才注意到 ...
- pycharm 汉化
1.首先进入pycharm,点击file,找到setting. 2.点击 plugins 搜索Chinese,找到Chinese(simplified)Language Pack EAP,点击inst ...
- JS005. 拷贝引用数据类型Array使其指向不同堆的解决方案
一个很常见的语法问题,但专注实现需求时经常会忘记去避免,导致最终问题的出现,再花时间排查.为此专门整理一篇解决方法的博客,也加强一下自己的记忆. TAG: JSON.parse() JSON.stri ...
- 装配Bean的三种方式
一.装配Bean就是在xml写一个Bean标签:装配完Bean,还需要读取xml配置文件创建Spring容器来创建对象: 1.new 实现类方式 正常的三种创建Bean容器的方法都可以根据装配的Bea ...