https://www.luogu.org/problem/lists?name=%E5%90%8C%E4%BD%99%E6%96%B9%E7%A8%8B&orderitem=pid&tag=
题目:
题目描述
求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。
输入
输入只有一行,包含两个正整数 a, b,用一个空格隔开。
输出
输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。
样例输入
3 10
样例输出
7
思路:对题目中的式子进行变形可以得到ax - by = 1.可用扩展欧几里德算出一组x,y
由于保证数据肯定有解,可知gcd(a,b) = 1
由书中可知 x` = x + kb`,y` = y + k a`.其中(a` = a/gcd(a,b),b` = b / gcd(a,b) )
long long temp = b / d;/*注:因为要求最小,依旧要满足方程,那么要保证当x改变,依旧是成立的。而b / d 作为x改变值,是能使得方程成立的最小值(如果肯能是负数要换成整数)*/
x = (x % temp + temp) % temp;的方法确保是最小的整数解
get
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
using namespace std;
void gcd(long long a,long long b,long long &d,long long &x,long long &y)
{
if(!b)
{
d = a,x = 1,y = 0;
}
else {
gcd(b,a%b,d,y,x);
y -= x *(a/b);
}
}
int main()
{
// freopen("in.txt","r",stdin);
long long a,b;
scanf("%lld%lld",&a,&b);
long long d,x,y;
gcd(a,b,d,x,y);
long long temp = b / d;
x = (x % temp + temp) % temp;
printf("%lld\n",x);
return 0;
}