- 题干在此
题干分析 & 思路讲解
- ax=1(mod b),分析这个式子,可得ax+by=1(不懂看蓝书),然后用扩展欧几里得算法 可求方程的特解x0,然后再求通解x:
x = ( x 0 + b ) % b x=(x _0+b)%b x=(x0+b)%b
b就是题目中的b,将x+b后%b可以保证x为正整数,并且小于零
ps. 蓝书的标程比这个复杂多了(小小的得意一下)
程序在此
// 2020.10.17 jqsh 好难...
#include<bits/stdc++.h>
using namespace std;
//int d;
inline void EXgcd(int a,int b,int &x,int &y){ //扩欧
if(!b){ //b=0时方程解易求 (即ax+by=ax+0=gcd(a,b)=gcd(a,0)=a,x=1)
x=1;y=0; //即ax+by=ax+0*y=a*1+b*0
// d=a; //d是最大公因数 ps.d在此题中恒等于1,所以不求了
return;
}
EXgcd(b,a%b,x,y); //和gcd差不多,EXgcd就是在gcd中的过程上求特解
int t=x;
x=y;y=t-(a/b*y); //多项式相乘即可得出 ps.x>0,y>0
return;
}
int main(){
int a,b,x,y;
cin>>a>>b;
EXgcd(a,b,x,y); //扩欧求ax+by=gcd(a,b)=1的一个特解
cout<<(x+b)%b<<endl; //终极简化版本
// 其实简化版本1,2更好理解
// cout<<abs(x+b)%b<<endl; 简化版本2.0
/****** 仔细看EXgcd中,其实x+b一直大于0 *****/
// cout<<(x%b+b)%b<<endl; 简化版本1.0 ps.x%b+b就是求绝对值
// 在此题中d一直等于1
// cout<<((x/d)%(b/d)+(b/d))%(b/d)<<endl; //求通解中的最小值(蓝书标程)
// ps.看起来好晕,还好可以简化
return 0;
}