中国剩余定理CRT&EXCRT

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。

oiwiki

\(\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];
posted @ 2026-07-05 14:29  msjing  阅读(8)  评论(0)    收藏  举报