1. 程式人生 > >擴充套件歐幾里德求逆元+通用除法取模

擴充套件歐幾里德求逆元+通用除法取模

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=1e5+9;
int e_gcd(int a,int b,int &x,int &y){
	if(!b){
		x=1;
		y=0;
		return a;
	}
	int gcd=e_gcd(b,a%b,y,x);
	y-=x*a/b;
	return gcd;
}
int inv(int a,int m){
	int x,y;
	int d=e_gcd(a,m,x,y);
	if(d!=1)return -1;
	int ans=(x%m+m)%m;
	return ans;
}
int main(){
	int a,b,mod;
	cin>>a>>b>>mod;
	int ans=a*inv(b,mod)%mod;
	int reans=a%(mod*b)/b;//適用於所有的除法取模,不過mod*b過大可能資料溢位
	if(inv!=-1)
	cout<<ans<<endl;
	else 
	cout<<reans<<endl;
}

(a/b)%mod=a%(mod*b)/b證明過程:

不妨設

a/b=k*mod+x;x=(a/b)%mod;

a=k*b*mod+b*x;

a%(b*mod)=b*x;

a%(b*mod)/b=x;

因x=(a/b)%mod,故可得到

a%(b*mod)/b=(a/b)%mod;

證畢。