洛谷 [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先生. ...
随机推荐
- PHP高端课程
关于目后佐道IT教育 http://www.cnblogs.com/itpua/p/7710917.html 目后佐道IT教育的师资团队 http://www.cnblogs.com/itpua/p/ ...
- 使用js将后台返回的数据转换成树形结构
将类似如下数据转换成树形的数据: [ { id: 1, name: '1', }, { id: 2, name: '1-1', parentId: 1 }, { id: 3, name: '1-1-1 ...
- Codeforces Round #277.5 (Div. 2)-C. Given Length and Sum of Digits...
http://codeforces.com/problemset/problem/489/C C. Given Length and Sum of Digits... time limit per t ...
- vs 2017 boost 安装目录 非安装
linuxg++ -Wall -std=c++11 boost_socks5.cpp -o boost_socks5 -lboost_system -lboost_thread -lpthread m ...
- Luogu P3938 斐波那契
Luogu P3938 斐波那契 第一眼看到这题,想到的是LCA,于是开始想怎么建树,倒是想出了\(n^{2}\)算法,看了下数据范围,果断放弃 想了想这数据范围,大的有点不正常,这让我想起了当年被小 ...
- tp5 -- 微信公众号支付
近来期间比较忙, 忙完之后发现最近有挺多的东西没有整理,于是乎.就将以前用到的一些小东西整理了一下. 如果对您有帮助,则是我最大的幸运. 本篇主要是说了一下整合TP5的微信公众号支付. 不过由于最近T ...
- CSS - position属性小结
Relative: 属于文档流,针对自身进行偏移: Absolute: 脱离文档流,针对最近的定位元素进行偏移,如果没有,则针对根元素,即body标签尽心偏移: Fixed: 和absolute基本一 ...
- java在线聊天项目0.5版 解决客户端向服务器端发送信息时只能发送一次问题 OutputStreamWriter DataOutputStream socket.getOutputStream()
没有解决问题之前客户端代码: package com.swift; import java.awt.BorderLayout; import java.awt.Color; import java.a ...
- cocos2d-x游戏开发(一)之环境搭建篇
前言 进入研究生生涯已经有一段时间,感觉却没做些什么,实验室虽有一个很大的国家项目,但考虑到它这么的单一,总想利用业余时间做些什么,拓宽一下自己的知识面. 偶然机会,了解到cocos这个东东,恰好,实 ...
- Luogu 2569 [SCOI2010]股票交易 (朴素动规转移 + 单调队列优化)
题意: 已知未来 N 天的股票走势,第 i 天最多买进 as [ i ] 股每股 ap [ i ] 元,最多卖出 bs [ i ] 股每股 bp [ i ] 元,且每天最多拥有 Mp 股,且每两次交易 ...