中国剩余定理
中国剩余定理 CRT
定义

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问题扩展出来的
定义

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;
}
以下是签名
${\scr {jade }}$ ${\scr {seek }}$
本文来自博客园,作者:BIxuan—玉寻,转载请注明原文链接:https://www.cnblogs.com/zhangyuxun100219/p/18965025

浙公网安备 33010602011771号