63中国剩余定理
Posted passion27
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了63中国剩余定理相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a[500],r[500],k; ll gcd(ll a,ll b){ while(b!=0){ ll t=a; a=b; b=t%b; } return a; } ll lcm(ll a,ll b){ return a*b/gcd(a,b); } ll exgcd(ll a,ll b,ll &x,ll &y){ if(b==0) {x=1;y=0;return a;} ll r=exgcd(b,a%b,x,y); ll t=x;x=y;y=t-a/b*y; return r; } ll inv(ll a,ll p){//a模p意义下的逆 ll d,x,y;d=exgcd(a,p,x,y); return (x+p)%p==0?p:(x+p)%p; } ll CRT(ll a[],ll m[],ll n){ ll M=1; ll ans=0; for(int i=1;i<=n;i++) M*=m[i]; //M为Πmi //并设Mi=M/mi,ti=Mi^-1表示Mi模mi意义下的倒数 //即Miti≡1%mi; for(int i=1;i<=n;i++) { ll x,y; x=inv(M/m[i],m[i]); ans=(ans+M/m[i]*x*m[i])%M; } ans=(ans+M)%M; return ans; } inline ll read(){ char c=getchar();ll s=0,f=1; while(c<\'0\'||c>\'9\'){ if(c==\'-\') f=-1; c=getchar(); } while(c>=\'0\'&&c<=\'9\'){ s=s*10+c-\'0\'; c=getchar(); } return s*f; } inline void write(ll x){ if(x<0) { putchar(\'-\'); x=-x; } if(x>9) write(x/10); putchar(x%10+\'0\'); } int main(){ k=read(); for(int i=1;i<=k;i++) { a[i]=read(); r[i]=read(); } for(int i=2;i<=k;i++) { //两两合并 ll r1=r[i-1],r2=r[i],a1=a[i-1],a2=a[i]; ll g=gcd(a1,a2); if((r2-r1)%g) { printf("-1"); return 0; } a[i]=a1*a2/g; r[i]=((inv(a1/g,a2/g)*((r2-r1)/g)%(a2/g)*a1+r1)%a[i]+a[i])%a[i]; } write(r[k]); return 0; }
以上是关于63中国剩余定理的主要内容,如果未能解决你的问题,请参考以下文章