洛谷 [P2485] 计算器
快速幂+同余方程+BSGS
同余方程在解的时候要注意,在将exgcd求出的解变换为原方程的解的时候,要取模
BSGS的原理就是用分块+hash优化暴力,要注意特判 a 和 b 是 p 的倍数的时候.
对于预处理,要预处理出来, $0 \sim t $的Hash值,以处理 答案是 0 的情况
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
#define ll long long
using namespace std;
ll p, a, b, n, opt;
ll quick_mod(ll n, ll k, ll p) {
ll ans = 1;
while(k) {
if(k & 1ll) (ans *= n) %= p;
(n *= n) %= p;
k >>= 1;
}
return ans;
}
ll exgcd(ll a, ll b, ll &x, ll &y) {
if(!b) {
x = 1; y = 0;
return a;
}
ll t = exgcd(b, a % b, x, y);
ll k = y;
y = x - a / b * y;
x = k;
return t;
}
void work2() {
ll r1, r2;
ll t = exgcd(a, p, r1, r2);
if(b % t) {printf("Orz, I cannot find x!\n");return;}
r1 *= b / t;
r1 %= (p / t);
(r1 += (p / t)) %= (p / t);
printf("%lld\n", r1);
}
void BSGS() {
b %= p;
if(a % p == 0) {
if(b == 1) {printf("0\n");return;}
if(!b) {printf("1\n");return;}
printf("Orz, I cannot find x!\n");
return;
}
map <int, int> Hash;
Hash.clear();
ll t = ceil(sqrt(p)), k = 1ll;
for(int i = 0; i <= t; i++) {
Hash[b * k % p] = i;
(k *= a) %= p;
}
ll tmp = quick_mod(a, t, p), ans = tmp;
for(int i = 1; i <= t; i++) {
if(Hash.find(ans) != Hash.end()){
printf("%lld\n", i * t - Hash[ans]);
return;
}
(ans *= tmp) %= p;
}
printf("Orz, I cannot find x!\n");
}
int main() {
cin >> n >> opt;
for(int i = 1; i <= n; i++) {
cin >> a >> b >> p;
switch(opt) {
case 1 : printf("%lld\n", quick_mod(a, b, p));break;
case 2 : work2();break;
case 3 : BSGS();break;
}
}
return 0;
}
洛谷 [P2485] 计算器的更多相关文章
- 洛谷 P2614 计算器弹琴
P2614 计算器弹琴 题目描述 总所周知,计算器可以拿来干很多它本不应该干的事情,比如写作文.(参看洛谷P2549) 小A发现了一个计算器的另一个隐藏功能——弹琴. http://www.bilib ...
- 洛谷 P1022 计算器的改良
题解:字符串模拟 坑点: 1) 0/-1=-0. 这是因为(来自洛谷讨论区某大犇) double下存储的数字会有精度误差,比如0可能被存成0.000000000...01然而如果你乘上或者除以一个负数 ...
- 洛谷 P2485 [SDOI2011]计算器 解题报告
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
- 【洛谷 P2485】 [SDOI2011]计算器 (BSGS)
题目链接 第一问:快速幂 第二问:扩欧解线性同余方程 第三问:\(BSGS\) 三个模板 #include <cstdio> #include <cmath> #include ...
- 洛谷P2485 [SDOI2011]计算器(exgcd+BSGS)
传送门 一题更比三题强 1操作直接裸的快速幂 2操作用exgcd求出最小正整数解 3操作用BSGS硬上 然后没有然后了 //minamoto #include<cstdio> #inclu ...
- 【洛谷P2485】计算器
BSGS模板题 代码如下 #include <bits/stdc++.h> using namespace std; typedef long long LL; LL fpow(LL a, ...
- 洛谷—— P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...
- 洛谷P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...
- [NOIP2000] 提高组 洛谷P1022 计算器的改良
题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先生. ...
随机推荐
- 新建maven的pom.xml第一行出错的解决思路
前言:博主在想要用maven创建项目的时候,忘记之前已经安装过maven了,所以再安装了另一个版本的maven,导致在pom.xml的第一行总是显示某一个jar的zip文件读取不出来. 在网上找了很多 ...
- UVA1665 Islands (并查集)
补题,逆序考虑每个询问的时间,这样每次就变成出现新岛屿,然后用并查集合并统计.fa = -1表示没出现. 以前写过,但是几乎忘了,而且以前写得好丑的,虽然常数比较小,现在重新写练练手.每个单词后面都要 ...
- python_108_格式化字符串format函数
#通过关键字映射 print('I am {name},age {age}'.format(name='qiqi齐',age=18))#I am qiqi齐,age 18 dictory={'name ...
- 【转载】WPF DataGrid 性能加载大数据
作者:过客非归 来源:CSDN 原文:https://blog.csdn.net/u010265681/article/details/76651725 WPF(Windows Presentatio ...
- Linux内核漏洞利用-环境配置(转)
实验环境: Ubuntu-14.04.1 x86 linux-2.6.32.1 busybox-1.27.2 qemu 0x00 安装qemu sudo apt-get install qemu qe ...
- Ckeditor for Drupal
Ckeditor for Drupal 关于Drupal的所见即所得编辑器,Ckeditor是一个不错的选择,而且可以在Ckeditor官网直接下载到专为Drupal制作的版本: http:/ ...
- ios之UIImageView
UIImageView,顾名思义,是用来放置图片的.使用Interface Builder设计界面时,当然可以直接将控件拖进去并设置相关属性,这就不说了,这里讲的是用代码. 1.创建一个UIImage ...
- postcss.config.js配置文件的配置方法
module.exports = { plugins: { 'autoprefixer': {}, } }
- 【计数】51nod1677 treecnt
要将答案看做是小问题的贡献和 Description 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算对于所有选择k ...
- RN与现有的原生app集成
https://facebook.github.io/react-native/docs/integration-with-existing-apps.html RN可以很好地支持往一个原生的app上 ...