擴充套件歐幾里德求逆元+通用除法取模
阿新 • • 發佈:2018-12-20
#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;
證畢。