1. 程式人生 > >noip2012 同餘方程

noip2012 同餘方程

題目描述

求關於xx的同餘方程 ax1(modb) 的最小正整數解。

輸入輸出格式

輸入格式:

 

一行,包含兩個正整數 a,b,用一個空格隔開。

 

輸出格式:

 

一個正整數 x,即最小正整數解。輸入資料保證一定有解。

 

看一下這個方程ax1(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); }