【學習筆記】擴展中國剩余定理
阿新 • • 發佈:2018-09-29
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; }
【學習筆記】擴展中國剩余定理