前置知识

中国剩余定理(CRT),逆元;

EXCRT是什么

我们知道,对于

对于

\[\begin{equation}
\begin{cases}
x \equiv c_1 \ (mod \ m_1) \\
x \equiv c_2 \ (mod \ m_2) \\
.\\
.\\
.\\
x \equiv c_i \ (mod \ \ m_i) \\
\end{cases}
\end{equation}
\]

一个一元线性同余方程组,GCT适用于模数是质数的情况,如果模数不是质数,就要用到EXGCT了;

EXCRT证明及用法

证明

首先,联立前两个式子,得

\[\begin{equation}
\begin{cases}
x \equiv c_1 \ (mod \ m_1) \\
x \equiv c_2 \ (mod \ m_2) \\
\end{cases}
\end{equation}
\]

进而

\[x = c_1 + m_1k_1 = c_2 + m_2k_2
\]
\[c_1 + m_1k_1 = c_2 + m_2k_2
\]
\[m_1k_1 = c_2 - c_1 + m_2k_2
\]

等式两边同除以$ gcd(m_1, m_2) $, 得:

\[\frac{m_1}{gcd(m_1, m_2)}k_1 = \frac{c_2 - c_1}{gcd(m_1, m_2)} + \frac{m_2}{gcd(m_1, m_2)}k_2
\]
\[\frac{m_1}{gcd(m_1, m_2)}k_1 \equiv \frac{c_2 - c_1}{gcd(m_1, m_2)} \ (mod \ \frac{m_2}{gcd(m_1, m_2)})
\]

到这里,我们就把 \(k_2\) 消掉了;

根据同余式的同乘性,同余式两边同除 $ \frac{m_1}{gcd(m_1, m_2)} $,得( $ x^{-1} $ 代表 $ x $ 在模意义下的逆元):

\[k_1 \equiv \frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ (mod \ \frac{m_2}{gcd(m_1, m_2)})
\]
\[k_1 = \frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ + \ y \ * \ \frac{m_2}{gcd(m_1, m_2)}
\]

$ y $ 是整数;

将 $ k_1 $ 带回 $ x = c_1 + m_1k_1 $ 中,得:

注意,下面的 $ (\frac{m_1}{gcd(m_1, m_2)})^{-1} $ 指的都是其在mod\(\frac{m_2}{gcd(m_1, m_2)}\) 下的逆元!

\[x = m_1\frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ + \ c_1 \ + \ y \ * \ \frac{m_1m_2}{gcd(m_1, m_2)}
\]
\[x \equiv m_1\frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ + \ c_1 \ (mod \ \frac{m_1m_2}{gcd(m_1, m_2)})
\]

其中,$ \frac{m_1m_2}{gcd(m_1, m_2)} = lcm(m1, m2)$;

到这,我们可以将最后一个式子与 $ x \equiv c_2 \ (mod \ m_2) $ 联立,以此类推,进行递归求解;

无解情况

显然,式子中的每个系数都应是整数,所以 $ c_2 - c_1 $ 应该能整除 $ gcd(m_1, m_2) $,若不能整除,则无解;

例题

Strange Way to Express Integers

板子;

#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
__int128 read() {
__int128 x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
} void out(__int128 x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) out(x / 10);
putchar(x % 10 + '0');
}
long long n;
__int128 m[1000005], c[1000005];
__int128 gcd(__int128 a, __int128 b) {
if (b == 0) return a;
else return gcd(b, a % b);
}
__int128 phi(long long nn) {
__int128 mm = sqrt(nn);
__int128 ans = nn;
for (__int128 i = 2; i <= mm; i++) {
if (nn % i == 0) {
ans = ans / i * (i - 1);
while(nn % i == 0) nn /= i;
}
}
if (nn > 1) ans = ans / nn * (nn - 1);
return ans;
}
__int128 qpow(__int128 a, __int128 b, __int128 p) {
__int128 ans = 1;
while(b) {
if (b & 1) ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans;
}
inline __int128 inv(__int128 a, long long b) {
__int128 pb = phi(b);
return qpow(a, pb - 1, b);
}
int main() {
while(scanf("%lld", &n) != EOF) {
bool v = true;
for (int i = 1; i <= n; i++) {
m[i] = read();
c[i] = read();
}
for (int i = 2; i <= n; i++) {
__int128 m1 = m[i - 1], m2 = m[i], c1 = c[i - 1], c2 = c[i];
__int128 g = gcd(m1, m2);
if ((c2 - c1) % g != 0) {
printf("%d\n", -1);
v = false;
break;
}
m[i] = (m1 * m2) / g;
c[i] = inv(m1 / g, (long long)m2 / g) * (c2 - c1) / g * m1 + c1;
c[i] = (c[i] % m[i] + m[i]) % m[i];
}
if (!v) continue;
out(c[n]); //最后c[n]为答案,且c[n]是答案中最小的,因为其已经mod了所有m[i];
printf("\n");
}
return 0;
}

扩展中国剩余定理证明及例题 Strange Way to Express Integers的更多相关文章

  1. 中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)

    0.引子 每一个讲中国剩余定理的人,都会从孙子的一道例题讲起 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 1.中国剩余定理 引子里的例题实际上是求一个最小的x满足 关键是,其中 ...

  2. 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

    F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format: ...

  3. poj 2981 Strange Way to Express Integers (中国剩余定理不互质)

    http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 13 ...

  4. Strange Way to Express Integers(中国剩余定理+不互质)

    Strange Way to Express Integers Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%I64d & ...

  5. poj 2891 Strange Way to Express Integers (非互质的中国剩余定理)

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9472   ...

  6. [POJ 2891] Strange Way to Express Integers

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 10907 ...

  7. poj——2891 Strange Way to Express Integers

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 16839 ...

  8. POJ2891——Strange Way to Express Integers(模线性方程组)

    Strange Way to Express Integers DescriptionElina is reading a book written by Rujia Liu, which intro ...

  9. 一本通1635【例 5】Strange Way to Express Integers

    1635:[例 5]Strange Way to Express Integers sol:貌似就是曹冲养猪的加强版,初看感觉非常没有思路,经过一番艰辛的***,得到以下的结果 随便解释下给以后的自己 ...

  10. POJ2891 Strange Way to Express Integers

    题意 Language:Default Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total S ...

随机推荐

  1. mysql主从复制原理-binlog

    0.为什么需要主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出 ...

  2. LTS1.3秘钥导出和身份验证计算过程

    具体的参照描述协议规范文档   TLS1.3  RCF:8446 最新一版 协议描述的密钥推导计算流程图: TLS1.3内部非复杂程度难以想象.到底CPN Tools能否支撑分析TLS,我现在从新要整 ...

  3. [VueJsDev] 快速入门 - vscode 插件推荐

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html Vscode 插件推荐 ::: details 目录 目录 ...

  4. RaspberryPi 树莓派 omxplayer 的音量设置方法实测有效!

    正确的设置初始音量的方法,其中n/100=你期望的初始dB值, omxplayer --vol n target.media omxplayer介绍 omxplayer 在github中的描述是一个弃 ...

  5. display标签简介

    下面是网友总结的display标签的优缺点: 1. 分页 如果想对代码分页,只需在display:table标签中添加一项pagesize="每页显示行数" 2. 对列排序 dis ...

  6. 项目升级到Android31版本dlopen找不到系统so库文件

    简介 最近有个海外项目需要把之前项目从30版本升级到31版本,升级后发现就发现一个问题: 因为我们的项目是系统签名的apk,所以集成到系统中后是没有任何问题的,但是当我们手动安装后就会出现使用dlop ...

  7. 【Django】HTML如何显示富文本内容

    一.背景 我采用的前端样式是 LayUI,通过它的富文本编辑器保存内容到数据库后,遇到了一个回显到页面的问题 二.方案 在不考虑使用 Vue 的情况下,有一种简单的方式 <div id=&quo ...

  8. 记录--Vue3自定义一个Hooks,实现一键换肤

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 核心 使用CSS变量, 准备两套CSS颜色, 一套是在 light模式下的颜色,一套是在dark模式下的颜色 dark模式下的 CSS 权 ...

  9. mysql mysqldump 命令导出

    1.导出指定表的数据 mysqldump -t database -u user -p  --table_name1 table_name2 table_name3 >C:\db_script. ...

  10. python opencv DNN 人脸检测

    import cv2 modelFile = "res10_300x300_ssd_iter_140000_fp16.caffemodel" configFile = " ...