中国剩余定理(CRT)学习笔记
定义
中国剩余定理(Chinese Remainder Theorem,CRT) 可求解如下形式的一元线性同余方程组(其中 两两互质):
过程
1.计算所有模数的积 ;
2.对于第 的方程:
-
a. 计算 ;
-
b. 计算 在模 意义下的逆元 ;
-
c.计算 (不要对 取模)。
3.方程组在模 意义下的唯一解为
模板题code:
#include<iostream>
using namespace std;
#define int long long
const int N=21;
int x,y,n,a[N],m[N],ans,M=1;
int mul(int a,int b,int p)
{
int res=1;
while(b)
{
if(b&1) res=(res*a)%p;
a=(a*a)%p;
b>>=1;
}
return res;
}
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int t=x;
x=y,y=t-y*(a/b);
return d;
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&m[i],&a[i]),M*=m[i];
for(int i=1;i<=n;i++)
{
x=0,y=0;
exgcd(M/m[i],m[i],x,y);
if(x<0) x+=m[i];
ans=ans+a[i]*(M/m[i])*x;
}
printf("%lld\n",ans%M);
return 0;
}
扩展:模数不互质的情况
这种情况下,可以假设已经求出前 个方程组的解为 , 且有 。(为了防止溢出,一般可以取 ,可以证明这样做与直接相乘等价)。
那么前 个方程组的通解就是 。
现在加入了第 个方程,那么就是要求出方程 中 的解。可以用到扩展欧几里得定理求解。
于是,前 个方程的通解就是 。
模板题:
#include<iostream>
using namespace std;
#define int long long
int n,M=1,x,y,a,b,ans;
int read()
{
int f=1,x=0;
char ss=getchar();
while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
return f*x;
}
int exgcd(int &x,int &y,int a,int b)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d=exgcd(x,y,b,a%b);
int t=x;
x=y,y=t-a/b*y;
return d;
}
int mul(int a,int b,int mod)
{
int res=0;
while(b)
{
if(b&1) res=(res+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return res;
}
signed main()
{
n=read();
M=read(),ans=read();
for(int i=2;i<=n;i++)
{
b=read(),a=read();
int c=(a-ans%b+b)%b;
int d=exgcd(x,y,M,b),k=b/d;
x=mul(x,c/d,k);
ans+=x*M;
M*=k;
ans=(ans%M+M)%M;
}
printf("%lld\n",(ans%M+M)%M);
return 0;
}
分类:
学习笔记
标签:
数论
, 中国剩余定理(CRT)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!