扩展欧几里得算法
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
else
{
ll res=exgcd(b,a%b,y,x);
y-=x*(a/b);
return res;
}
}
快速幂
ll mod_pow(ll x,ll n,ll mod)
{
if(n==0)return 1;
ll res=mod_pow(x*x%mod,n/2,mod);
if(n&1)res=res*x%mod;
return res;
}
逆元
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
else
{
ll res=exgcd(b,a%b,y,x);
y-=x*(a/b);
return res;
}
}
ll inv(ll a,ll n)
{
ll x,y;
exgcd(a,n,x,y);
return (x%n+n)%n;
}
中国剩余定理
#include<iostream>
typedef long long ll;
using namespace std;
ll yu[120],chu[120];
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
else
{
ll res=exgcd(b,a%b,y,x);
y-=x*(a/b);
return res;
}
}
ll china(int l)
{
ll d,x,y,m,n=1,ret=0;
for(int i=0;i<l;i++)
n*=chu[i];
for(int i=0;i<l;i++)
{
m=n/chu[i];
d=exgcd(chu[i],m,x,y);
ret=(ret+y*m*yu[i])%n;
}
return (n+ret%n)%n;
}
int main()
{
int N;
cin>>N;
for(int i=0;i<N;i++)
cin>>chu[i]>>yu[i];
cout<<china(N)<<endl;
return 0;
}
敬请期待,后续内容将持续更新......