1. 程式人生 > >【學習筆記】擴展中國剩余定理

【學習筆記】擴展中國剩余定理

exc b- ++ print include col n) 學習筆記 \n

打了一堆竟然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; }

【學習筆記】擴展中國剩余定理