【学习笔记】扩展中国剩余定理
打了一堆竟然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; }