CRT&EXCRT(中国剩余定理和扩展中国剩余定理)
稍微难一点,其实也挺简单。
CRT:
用途:
给定一个同余方程组,保证所有
用于求其解。
具体方法:
自我感觉叫方法好一点,建议理解记忆,公式见下。
首先我们先找一组数
因为:如果
所以:
如果
如果
也就是说,要想使
只需要
同理,我们设
只需要
因为所有
接下来考虑怎么求
我们设
于是我们只需求一个
因为
当然也可以先用乘法逆元算
这样我们就可以求出所有
公式:
设
则
这里的
例题
CODE(点击查看)
#include<bits/stdc++.h> using namespace std; #define llt long long int n,m[12],a[12]; template<typename T> inline void read(T &x){ char s=getchar();x=0;bool pd=false; while(s<'0'||'9'<s){if(s=='-') pd=true;s=getchar();} while('0'<=s&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=getchar(); if(pd) x=-x; } void exgcd(llt a,llt b,llt &x,llt &y){ if(b==0) x=1,y=0; else exgcd(b,a%b,y,x),y-=a/b*x; } int main(){ read(n); long long tm=1,ans=0; for(int i=1;i<=n;i++) read(m[i]),read(a[i]),tm*=m[i]; for(int i=1;i<=n;i++){ long long lm=tm/m[i],x,y; exgcd(lm,m[i],x,y); x=(x%m[i]+m[i])%m[i]; ans=(ans+x*a[i]*lm)%tm; } printf("%lld",ans%tm); }
这里推荐一篇博客,讲的很细(我从那里学的,本文也有很多借鉴。
EXCRT
其实和
我们来看一下同余方程组
这里不保证
首先看第一二个式子:
变形得到:
整理:
运用
将上式带入
变形得到:
于是我们就成功将两个同余方程化简成了一个。
同理化简下去直到一个,求解即可。
例题
CODE(点击查看)
#include<bits/stdc++.h> using namespace std; #define llt long long __int128 n,na=0,nm=1; template<typename T> inline void read(T &x){ char s=getchar();x=0;bool pd=false; while(s<'0'||'9'<s){if(s=='-') pd=true;s=getchar();} while('0'<=s&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=getchar(); if(pd) x=-x; } llt gcd(llt a,llt b){return (b==0)?a:gcd(b,a%b);} llt lcm(llt a,llt b){return a/gcd(a,b)*b;} void exgcd(__int128 a,__int128 b,__int128 &x,__int128 &y){ if(b==0) x=1,y=0; else exgcd(b,a%b,y,x),y-=a/b*x; } inline void hebing(llt a,llt m){ llt sa=a-na; __int128 x,y; llt gd=gcd(nm,m); exgcd(nm,m,x,y); llt lm=m/gd;x*=(sa/gd),y*=(sa/gd); x=(x%lm+lm)%lm; na=na+nm*x; nm=lcm(nm,m); } int main(){ #ifndef ONLINE_JUDGE freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif read(n); for(llt a,m,i=1;i<=n;i++) read(m),read(a),hebing(a,m); __int128 x,y; exgcd(1,nm,x,y); x=(x*na%nm+nm)%nm; long long ans=x; printf("%lld",ans); }
本文来自博客园,作者:5k_sync_closer,转载请注明原文链接:https://www.cnblogs.com/xrlong/articles/17073430.html
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了