luoguP3868 [TJOI2009]猜数字

中国剩余定理模板题,记得快速乘(慢速乘)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=15;
ll a[maxn],b[maxn],m=1;
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(b==0){
        x=1;y=0;
        return a;
    }
    ll ret=exgcd(b,a%b,x,y);
    ll temp=x;
    x=y;y=temp-(a/b)*y;
    return ret;
}
ll qmul(ll a,ll b,ll mod)
{
    ll ans=0;
    while(b>0)
    {
        if(b&1) ans=(ans+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return ans;
}
int main(){
    int n;
    ll ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
    for(int i=1;i<=n;++i){
        scanf("%lld",&b[i]);
        m*=b[i];
    }
    for(int i=1;i<=n;++i){
        a[i]=(a[i]%b[i]+b[i])%b[i];
        ll mi=m/b[i],x,y;
        exgcd(mi,b[i],x,y);
        x=(x%b[i]+b[i])%b[i];
        ans=(ans+qmul(qmul(mi,a[i],m),x,m))%m;
    }
    ans=(ans+m)%m;
    printf("%lld",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Dream-Runner/p/9446593.html