题目:P4777 【模板】扩展中国剩余定理(EXCRT)
题目分析: 可见博客:中国剩余定理算法详解(余数互质和不互质)
Code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll Read(){
ll fh=1,dx=0;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
dx=dx*10+c-'0';
c=getchar();
}
return fh*dx;
}
ll n,a[100005],b[100005];
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 tem=X;
X=Y;
Y=tem-A/B*Y;
return R;
}
ll ExCRT(){
ll a1,a2,n1,x0,n2,k1=0,y=0,c,d,s,K;
a1=a[1];n1=b[1];
for(int i=2;i<=n;++i){
a2=a[i],n2=b[i];
c=a2-a1;
d=exgcd(n1,n2,k1,y);
x0=c/d*k1;
s=n2/d;
x0=(x0%s+s)%s;
a1=a1+n1*x0;
n1/=d;
n1*=n2;
}
return a1%n1;
}
int main(){
n=Read();
for(int i=1;i<=n;++i){
b[i]=Read();
a[i]=Read();
}
printf("%lld",ExCRT());
return 0;
}
总结与反思:
做
数
论
的
题
时
一
定
不
要
开
u
n
s
i
g
n
e
d
l
o
n
g
l
o
n
g
i
n
t
\huge做数论的题时一定不要开unsigned\ long\ long\ int
做数论的题时一定不要开unsigned long long int
纪念查错1个小时才发现中国剩余定理可能会出现负数的我