中国剩余定理
限制条件,divs所有均两两互质
#include<bits/stdc++.h>
#define ll long long
using namespace std;
//const int mod=1e9+7;
const int N=12;
int n;
ll divs[N],mo[N];
ll exdiv;
ll exgcd(ll a ,ll b, ll &x,ll &y)//求逆元
{
if(b==0)
{
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll chease()//中国剩余定理
{
ll mi;
ll ans=0;
ll x,y;
for(int i=0;i<n;i++)
{
mi=exdiv/divs[i];
ll d=exgcd(mi,divs[i],x,y);
ans=(ans+mo[i]*mi%exdiv*x%exdiv)%exdiv;
}
return (ans+exdiv)%exdiv;
}
int main()
{
exdiv=1;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>divs[i]>>mo[i];
exdiv*=divs[i];
}
cout<<chease()<<endl;
return 0;
}
扩展欧几里得求逆元
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
int a,b,x,y;
cin>>a>>b;
ll c=exgcd(a,b,x,y);
cout<<(x+b)%b;//逆元
return 0;
}