noip2012 同餘方程
阿新 • • 發佈:2018-11-11
題目描述
求關於xx的同餘方程 ax≡1(modb) 的最小正整數解。
輸入輸出格式
輸入格式:
一行,包含兩個正整數 a,b,用一個空格隔開。
輸出格式:
一個正整數 x,即最小正整數解。輸入資料保證一定有解。
看一下這個方程ax≡1(modb) ,的意思是ax-1是b的倍數,我們設ax-1是b的-y倍,那麼就是ax-1=-yb,移項得:ax+by=1,這不就是擴充套件歐幾里得嗎?
把x、y解出來,然後再用一下求最小正整數解就好了
#include <iostream> #include<cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #define REP(i,k,n) for(long long i=k;i<=n;i++) #define in(a) a=read() using namespace std; inline long long read(){ long long x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } long long a,b,x,y,d,t; inline void exgcd(long long a,long long b,long long &d,long long &x,long long &y){ if(!b) d=a,x=1,y=0; else exgcd(b,a%b,d,x,y),t=x,x=y,y=t-a/b*y; }int main(){ in(a),in(b); exgcd(a,b,d,x,y); long long a1=a/d,b1=b/d; printf("%lld",(x%b1+b1)%b1); }