当前位置:网站首页>【洛谷】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})。
边栏推荐
猜你喜欢
随机推荐
Likou Brush Question Record 3.1-----977. Square of ordered array
数仓第二篇: 数据模型(维度建模)
gpio子系统和pinctrl子系统(中)
概率模型校准
科大讯飞笔试题复盘
1261. 在受污染的二叉树中查找元素
危化企业双预防机制数字化建设工作要求
20220527动态规划:零钱兑换
时间复杂度和空间复杂度
Flume (四) --------- Flume 企业开发案例
最近看到很多人想自学或者报班但是不清楚如何选择,我今天就和大家说说
gpio子系统和pinctrl子系统(下)
终于有人把灰度发布架构设计讲明白了
连接数据库且在网页运行的RDLC
DSP28379学习笔记 (一)——GPIO基本操作
20220523搜索和排序:搜索旋转排序数组
全志平台双路LVDS配置
【电商运营】不知道怎么做网站优化?这里有你需要知道的一切!
20220530设计问题:常数时间插入、删除和获取随机元素
jmeter的websocket插件安装和使用方法