【学习笔记】扩展中国剩余定理

打了一堆竟然unsaved?

网不好,难受。

直接扔板子,内用龟速乘。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll gcd(ll x,ll y){if(!y) return x;return gcd(y,x%y);}
void exgcd(ll a,ll b,ll& x,ll& y) {
    if(!b) { x=1; y=0; return; }
    else { exgcd(b,a%b,y,x); y-=x*(a/b); }
}
ll mul(ll a,ll b,ll mod) {
    ll ans=0;
    for(;b;b>>=1) {
        if(b&1) ans = (ans+a)%mod;
        a=(a*2)%mod; 
    }
    return ans;
}
ll excrt() {
    int n;
    scanf("%d",&n);
    ll m, a, b, x;
    scanf("%lld%lld",&a,&b);
    x=b; m=a;
    for(int i=1;i<n;i++) {
        scanf("%lld%lld",&a,&b);
        ll rate=1, p, q, qwq=(b-(x%a)+a)%a;
        exgcd(m,a,p,q);
        if(qwq%gcd(m,a)!=0) {
            return -1;
        }
        else {
            rate=qwq/gcd(m,a)%a;
            p=mul(p,rate,a);
        }
        x+=m*p;
        m=m/gcd(m,a)*a;
        x=(x+m)%m;
    }
    return x;
}
int main() {
    printf("%lld\n",excrt());
    return 0;
}

 

posted @ 2018-09-29 20:03  noble_(noblex)  阅读(238)  评论(0编辑  收藏  举报
/* */