当前位置:网站首页>【洛谷】P1082 同余方程
【洛谷】P1082 同余方程
2022-08-09 02:41:00 【记录算法题解】
题目地址:
https://www.luogu.com.cn/problem/P1082
题目描述:
求关于 x x x的同余方程 a x ≡ 1 ( m o d b ) a x \equiv 1 \pmod {b} ax≡1(modb)的最小正整数解。
输入格式:
一行,包含两个正整数 a , b a,b a,b,用一个空格隔开。
输出格式:
一个正整数 x 0 x_0 x0,即最小正整数解。输入数据保证一定有解。
数据范围:
对于 40 % 40\% 40%的数据, 2 ≤ b ≤ 1 , 000 2 ≤b≤ 1,000 2≤b≤1,000;
对于 60 % 60\% 60%的数据, 2 ≤ b ≤ 50 , 000 , 000 2 ≤b≤ 50,000,000 2≤b≤50,000,000;
对于 100 % 100\% 100%的数据, 2 ≤ a , b ≤ 2 , 000 , 000 , 000 2 ≤a, b≤ 2,000,000,000 2≤a,b≤2,000,000,000。
即求解 a x + b y = 1 ax+by=1 ax+by=1的所有解 ( x , y ) (x,y) (x,y)中 x x x最小正整数可以是多少。可以用扩展欧几里得算法求出一组解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),则所有解为 ( x 0 + k b , y 0 − k a ) (x_0+kb, y_0-ka) (x0+kb,y0−ka),那么 x x x可以取到的最小正整数就是 x x x在模 b b b剩余类里最小正代表元。代码如下:
#include <iostream>
using namespace std;
long a, b;
long exgcd(long a, long b, long& x, long& y) {
if (!b) {
x = 1, y = 0;
return a;
}
long d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main() {
scanf("%ld%ld", &a, &b);
long x, y;
exgcd(a, b, x, y);
x = (x % b + b) % b;
printf("%ld\n", x);
}
时空复杂度 O ( log min { a , b } ) O(\log\min\{a,b\}) O(logmin{ a,b})。
边栏推荐
猜你喜欢
随机推荐
危化企业双预防机制数字化建设工作要求
独立机器连接cdh的spark集群,远程提交任务(绝对可以成功,亲测了n遍)
[TensorRT] 对UNet进行推理加速
[Redis] The core principle of master-slave replication
概率模型校准
腾讯地图获取定位
SQLite切换日志模式优化
ApiFile配置环境
iFLYTEK Written Exam Questions Review
gpio子系统和pinctrl子系统(中)
USB 触摸在竖屏时校准
OpenLORIS-Object Datasets
全志平台双路LVDS配置
Appium常用操作及H5页面元素定位
C#计算SHA1加密和base64编码
OJ:L2-012 关于堆的判断
基于NLP的智能问答系统核心技术
[LeetCode305周赛] 6136. 算术三元组的数目,6139. 受限条件下可到达节点的数目,6137. 检查数组是否存在有效划分,6138. 最长理想子序列
Take you do interface test from zero to the first case summary
xml引配置文件