复习了一下crt,之前用的是exgcd求逆元过了,我就尝试换成费马小定理来求,重新写了一边,神奇WA了,是我求逆元写挂了还是别的部分写挂了?
代码:
#include <bits/stdc++.h>
using namespace std;
#define reg register
#define int long long
namespace IAKIOI
{
typedef long long ll;
const int maxn=11;
int n;
int mod[maxn];
int a[maxn];
ll MUL=1;
ll MOD[maxn];
ll c[maxn];
ll ksm(ll a,ll b,ll p)
{
ll ret=1;
while(b)
{
if(b&1)ret=ret*a%p;
a=a*a%p;
b>>=1;
}
return ret;
}
ll inv(ll a,ll p)
{
return ksm(a,p-2,p);
}
void main()
{
scanf("%lld",&n);
for(reg int i=1;i<=n;i++)
{
scanf("%lld%lld",&mod[i],&a[i]);
MUL*=(ll)mod[i];
}
for(reg int i=1;i<=n;i++)
{
MOD[i]=MUL/(ll)mod[i];
c[i]=inv(MOD[i],(ll)mod[i]);
c[i]=(c[i]%(ll)mod[i]+(ll)mod[i])%(ll)mod[i];
}
ll ans=0;
for(reg int i=1;i<=n;i++)
{
ans+=a[i]*MOD[i]*c[i];
}
ans%=MUL;
printf("%lld",ans);
}
}
signed main()
{
IAKIOI::main();
return 0;
}