复习一下

扩展中国剩余定理

  • 首先考虑两个同余方程

\[x \equiv a_1\; mod\; m_1\\
x \equiv a_2\; mod\; m_2
\]

  • 化成另一个形式

\[x = n_1 * m_1 + a_1\\
x = n_2 * m_2 + a_2
\]

  • 联立可得

\[n_1 * m_1 + a_1 = n_2 * m_2 + a_2\\
n_1 * m_1 - n_2 * m_2 = a_2 - a_1
\]

  • 有解的前提是

\[\gcd(m_1, m_2) |(a_2 - a_1)
\]

\[d = \gcd(m_1, m_2)\\
c = a_2 - a_1
\]

\[n_1 \frac{m_1}{d} - n_2 \frac{m_2}{d} = \frac{c}{d}\\
n_1 \frac{m_1}{d} \equiv \frac{c}{d} \ mod \ \frac{m_2}{d}
\]

  • 移项

\[n_1 \equiv \frac{c}{d} * inv(\frac{m_1}{d}, \frac{m_2}{d}) \ mod\ \frac{m_2}{d}\\
n_1 = \frac{c}{d} * inv(\frac{m_1}{d}, \frac{m_2}{d}) + y_1 * \frac{m_2}{d}
\]

然后\(n_1\)代入最上面的狮子可以得到

\[x = (\frac{c}{d} * inv(\frac{m_1}{d}, \frac{m_2}{d}) + y_1 * \frac{m_2}{d}) * m_1 + a_1\\
x = m_1 * \frac{c}{d} * inv(\frac{m_1}{d}, \frac{m_2}{d}) + y_1 * \frac{m_2 m_1}{d} + a_1\\
x \equiv m_1 * \frac{c}{d} * inv(\frac{m_1}{d}, \frac{m_2}{d}) + a_1 \ mod \ \frac{m_2 m_1}{d}
\]

  • 然后就是个新方程了
  • 当然也适用于互质情况
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define M 22
#define mmp make_pair
using namespace std;
int read()
{
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
} ll gcd(ll a, ll b)
{
return !b ? a : gcd(b, a % b);
} ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(!b)
{
x = 1, y = 0;
return a;
}
else
{
ll d = exgcd(b, a % b, x, y);
ll tmp = x;
x = y;
y = tmp - a / b * y;
return d;
}
} ll inv(ll a, ll p)
{
ll x, y;
ll d = exgcd(a, p, x, y);
if(d != 1) return -1;
return (x % p + p) % p;
}
ll a[M], b[M], n; ll excrt()
{
ll a1 = a[1], m1 = b[1], a2, m2;
for(int i = 2; i <= n; i++)
{
a2 = a[i], m2 = b[i];
ll c = a2 - a1, d = gcd(m1, m2);
if(c % d) return -1;
ll k = inv(m1 / d, m2 / d);
m2 = m1 / d * m2;
a1 = m1 * c / d % m2 * k + a1;
m1 = m2;
a1 = (a1 % m1 + m1) % m1;
}
return a1;
} int main()
{
n = read();
for(int i = 1; i <= n; i++) b[i] = read(), a[i] = read();
cout << excrt() << "\n";
return 0;
}

「一本通 6.4 例 4」曹冲养猪(CRT)的更多相关文章

  1. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  2. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  3. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  4. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  5. 「一本通 1.3 例 5」weight]

    「一本通 1.3 例 5」weight 题面 给定原数列 \(a_1,a_2,a_n\) ,给定每个数的前缀和以及后缀和,并且打乱顺序. 给出一个集合 \(S\) 要求从集合 \(S\) 中找到合适的 ...

  6. 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie

    题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...

  7. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  8. 「LOJ#10034」「一本通 2.1 例 2」图书管理 (map

    题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需 ...

  9. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

随机推荐

  1. mysql之 OPTIMIZE TABLE整理碎片

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  2. Linux 下的三种时间介绍

    Linux 下的三种时间介绍: Access Time:简写为atime,表示文件访问的时间,当文件内容被访问时,更新atime时间 Modify Time:简写为mtime,表示文件内容修改的时间, ...

  3. Intellj(IDEA)创建java webapp

    1. 创建工程 2. 创建Java文件 并且将java文件夹将设置为Sources Root 3. 创建test文件夹,并且在test文件夹下面创建java文件夹 将test下面的java文件夹标记为 ...

  4. SQL 中的 IFNULL和NULLIF

    sql 中的IFNULL和NULLIF很容易混淆,在此记录一下. IFNULL IFNULL(expression1, expression2) 如果expression1为null, 在函数返回ex ...

  5. hadoop不同版本有哪些

    一.Hadoop是什么? 首次听到hadoop这次单词,相信很多人跟我当时是一样,不免心中画上一个大大的问号——这是什么东西?Hadoop是什么?百度百科的解释是:Hadoop是一个由Apache基金 ...

  6. STM32的优先级的理解及其使用

    1 组只代表主优先级和副优先级数量的配比,组之间没有优先级的概念. 2 不同的主优先级中断之间,高优先级中断可以打断正在执行的低优先级中断,即可以形成中断嵌套. 3 主优先级相同的中断,高副优先级中断 ...

  7. 移动互联网终端的touch事件,touchstart, touchend, touchmove 很棒的文章

    转载请注明: 转载自WEB前端开发(www.css119.com)-关注常见的WEB前端开发问题.最新的WEB前端开发技术(webApp开发.移动网站开发).最好的WEB前端开发工具和最全的WEB前端 ...

  8. js写法【3】

    var m=[]; m[m.length]=xx;//相当于push 对Repeat方法提供了8种写法做比较,这一点还是不错的.

  9. SQL Server CONVERT() 日期转换为新数据类型的 通用函数

    http://www.w3school.com.cn/sql/func_convert.asp

  10. QT中实现应用程序的单例化

    一介绍 通过编写一个QSingleApplication类,来实现Qt程序的单例化,原文的作者是在Windows Vista + Qt4.4 下实现的,不过应用在其他平台上是没问题的.(本文是我在ht ...