博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展CRT
阅读量:6080 次
发布时间:2019-06-20

本文共 2027 字,大约阅读时间需要 6 分钟。

CRT是用于解一组同余方程:

$ x ≡ c1 ( mod\ m1)$

$ x ≡ c2 ( mod\ m2)$

...

$ x ≡ cn ( mod\ mn)$

当模数两两互质的时候,显然可以直接用朴素CRT合并

那当模数不互质的时候,就需要推一波式子采用扩展CRT了

考虑合并两个方程:

$ x ≡ c1 ( mod\ m1)$

$ x ≡ c2 ( mod\ m2)$

显然有$ x = c1+k1m1$, $ x = c2+k2m2$, 即$c1+k1m1=c2+k2m2$

移项得$ k1m1=k2m2+c2-c1$

我们令$ t=gcd(m1,m2)$, 则有$ \frac{m1}{t}k1=\frac{m2}{t}k2+\frac{c2-c1}{t}$

显然当且仅当$ t|c2-c1$时可以合并

此时有$ \frac{m1}{t}k1≡\frac{c2-c1}{t} (mod \frac{m2}{t})$

由于$ k1$的系数$ \frac{m1}{t}$和模数$ \frac{m2}{t}$互质,通过扩展欧几里得求得逆元$ inv$

则化简得$ k1≡\frac{c2-c1}{t}*inv \ (mod \frac{m2}{t})$

将$ k1$代回第一个方程得$ x≡(\frac{c2-c1}{t}*inv \ mod \frac{m2}{t})*m1+c1(mod \frac{m1*m2}{t})$

这是一个同余方程的形式,如此不断合并所有方程即可

时间复杂度:$ O$(方程数*$ log$(值域))

code:

#include
#include
#include
#include
#include
#define rt register int#define l putchar('\n')#define ll long long#define r read()using namespace std;inline ll read(){ register ll x = 0; char zf = 1; char ch; while (ch != '-' && !isdigit(ch)) ch = getchar(); if (ch == '-') zf = -1, ch = getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x * zf;}void write(ll y){
if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);}void writeln(const ll y){write(y);putchar('\n');}int i,j,k,m,n,x,y,z,cnt,sum;struct calc{ ll c,m;}ans,now;inline ll mul(ll x,ll y,ll mod){ ll tmp=(x*y-(ll)((long double)x/mod*y+1e-8)*mod); return tmp<0?tmp+mod:tmp;}ll gcd(ll x,ll y){
return !y?x:gcd(y,x%y);}void exgcd(ll a,ll b,ll &x,ll &y){ if(!b){x=1;y=0;return;} exgcd(b,a%b,y,x);y-=a/b*x;}ll inv(ll A,ll p){ ll x,y; exgcd(A,p,x,y); return (x<=0)?(x+p):x;}calc operator &=(calc &x,calc y){ const ll t=gcd(x.m,y.m); if(abs(y.c-x.c)%t){cout<<-1;exit(0);} x.c=mul(mul((y.c-x.c)/t,inv(x.m/t,y.m/t),y.m),x.m,x.m/t*y.m)+x.c; x.m=x.m/t*y.m;while(x.c<0)x.c+=x.m;}int main(){ n=read(); ans.m=read();ans.c=read(); for(rt i=1;i

 

转载于:https://www.cnblogs.com/DreamlessDreams/p/9358628.html

你可能感兴趣的文章
版本管理 GitLab 的安装及管理 (CentOS 7)
查看>>
以太网到以太网的本地交换
查看>>
Windows Server 2012之活动目录域服务部署
查看>>
ORACLE Bug 4431215 引发的血案—处理篇
查看>>
js切割字符串问题
查看>>
微信语音遥控Windows Azure云虚拟机
查看>>
DNS主机记录也能用*
查看>>
监视DNS服务器工作是否正常
查看>>
理解并取证:动态路由协议RIP的工作原理
查看>>
你也可以拥有F5
查看>>
Windows Server 2012 Release Candidate (RC发行预览版) Datacenter抢鲜看
查看>>
疯狂ios讲义之疯狂连连看游戏简介
查看>>
shell编程培训之shell的工作原理
查看>>
Linux环境变量配置介绍及实战
查看>>
【VMCloud云平台】SCCM (九)添加报表点
查看>>
有关puppet agent端三种备份恢复方案探讨研究
查看>>
Linux下/etc/fstab文件详解
查看>>
统一沟通-技巧-13-Lync-Polycom RMX 1500-配置
查看>>
WindowsServer 2008 R2 Active Directory PowerShell
查看>>
大数据虚拟化零起点-3基础运维第二步-安装vSphere 5.1
查看>>