中国剩余定理CRT&EXCRT
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。
\(\mathscr{CRT}\)
long long exgcd(long long a,long long b,long long &x,long long &y)
{
if (b == 0)
{
x=1;
y=0;
return a;
}
long long res=exgcd(b,a%b,x,y);
long long t=x;
x=y;
y=t-a/b*y;
return res;
}
long long crt(long long k,long long a[],long long r[])
{
long long n=1,ans=0;
for (long long i=1;i<=k;i++) n*=a[i];
for (long long i=1;i<=k;i++)
{
long long m=n/a[i],b,y;
exgcd(m,a[i],b,y);
(ans+=(r[i]*m*b%n))%=n;
}
return (ans%n+n)%n;
}
\(\mathscr{EXCRT}\)
long long exgcd(long long a,long long b,long long &x,long long &y)
{
if (b == 0)
{
x=1;
y=0;
return a;
}
long long res=exgcd(b,a%b,x,y);
long long t=x;
x=y;
y=t-a/b*y;
return res;
}
long long excrt(long long k,long long a[],long long r[])
{
long long a1=a[1],a2,r1=r[1],r2,x,y;
for (int i=2;i<=n;i++)
{
a2=a[i],r2=r[i];
long long g=exgcd(a1,a2,x,y);
if ((r2-r1)%g) return -1;
x*=(r2-r1)/g;
x=(x%(a2/g)+a2/g)%(a2/g);
r1=a1*x+r1,a1*=a2/g;
}
return (r1%a1+a1)%a1;
}
long long a[maxn],b[maxn];

浙公网安备 33010602011771号