中国剩余定理

中国剩余定理 CRT

定义

image

CRT 问题的解决方法

image

代码

模板题

P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪

#include<bits/stdc++.h>
using namespace std;
long long mod[0],yu[20];
long long M=1;
long long ans;
void exgcd(long long a,long long b,long long &x,long long &y)
{
	if(b==0)
	{
        x=1,y=0;
		return ;	
	} 
	exgcd(b,a%b,y,x);
	y=y-a/b*x; 
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>mod[i]>>yu[i];
		M*=mod[i];
	}
	for(int i=1;i<=n;i++)
	{
		long long Mi,mmy,y;
		Mi=M/mod[i];
		exgcd(Mi,mod[i],mmy,y);
		mmy=mmy%mod[i];
		ans=(ans+yu[i]*Mi*mmy)%M; 
	}
	cout<<(ans+M)%M;
	return 0;
 } 

扩展中国剩余定理 exCRT

其实和CRT没太大关系,只是解决的问题是由CRT问题扩展出来的

定义

image

exCRT 问题的解决方法

image
不会证直接粘

dong0717的证明

机房大蛇QEDQEDQED的证明

代码

模板题

P4777 【模板】扩展中国剩余定理(EXCRT)

#include<bits/stdc++.h>
using namespace std;

long long mod[100010],yu[100010];
__int128 a1=1,b1;
__int128 exgcd(__int128 a,__int128 b,__int128 &x,__int128 &y)
{
	if(b==0)
	{
        x=1,y=0;
		return a;	
	} 
	__int128 ans=exgcd(b,a%b,y,x);
	y=y-a/b*x;
	return ans;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>mod[i]>>yu[i];
	}
	for(int i=1;i<=n;i++)
	{
	    __int128 x,y;
	    __int128 ans=exgcd(a1,mod[i],x,y);
		x=(b1-yu[i])/ans*x;
		b1-=a1*x;
		a1=mod[i]/ans*a1;
		b1=(b1%a1+a1)%a1;
	}
	long long lans=(b1%a1+a1)%a1;
	cout<<lans;
	return 0;
 } 
posted @ 2025-07-04 09:34  BIxuan—玉寻  阅读(14)  评论(0)    收藏  举报