POJ - 2891 Strange Way to Express Integers (擴展中國剩余定理)
阿新 • • 發佈:2019-02-25
clu 剩余定理 span urn 傳送門 target pac 模板題 code
題目鏈接
擴展CRT模板題,原理及證明見傳送門(引用)
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef long long ll; 5 const ll N=1e5+10; 6 ll n,m[N],c[N]; 7 8 void exgcd(ll a,ll b,ll& x,ll& y,ll& g) { 9 if(!b)x=1,y=0,g=a; 10 else exgcd(b,a%b,y,x,g),y-=x*(a/b);11 } 12 ll CRT() { 13 ll M=1,C=0,x,y,g; 14 for(ll i=0; i<n; ++i) { 15 exgcd(M,m[i],x,y,g); 16 if((c[i]-C)%g)return -1; 17 C=x*((c[i]-C)/g)%(m[i]/g)*M+C; 18 M=M*m[i]/g,C%=M; 19 } 20 return (C%M+M)%M; 21 } 22 23 int main() { 24 while(scanf("%lld",&n)==1) { 25 for(ll i=0; i<n; ++i)scanf("%lld%lld",&m[i],&c[i]); 26 printf("%lld\n",CRT()); 27 } 28 return 0; 29 }
POJ - 2891 Strange Way to Express Integers (擴展中國剩余定理)