中国剩余定理

实质就是解nnn次互质的方程,然后分别乘以他们的取模剩余量,然后相加得到答案,这里就不展开叙述。

typedef long long ll;
const int N = 1e3 + 10;
int a[N], b[N], n;
void exgcd(ll a, ll b, ll &x, ll &y) {if(!b) {x = 1;y = 0;return ;}exgcd(b, a % b, x, y);ll temp = x;x = y;y = temp - a / b * y;return ;
}
void solve() {ll m = 1, x, y, ans = 0;for(int i = 1; i <= n; i++)m *= b[i];for(int i = 1; i <= n; i++) {ll t = m / b[i];exgcd(t, b[i], x, y);ans = (ans + x * t * a[i]) % m;}ans = (ans + m) % m;printf("%lld\n", ans);
}
int main() {scanf("%d", &n);for(int i  = 1; i <= n; i++)scanf("%d %d", &a[i], &b[i]);//a[i]是余数,b[i]是模数。solve();return 0;
}

中国剩余定理拓展

思路

我们规定b[i]b[i]b[i]时余数,a[i]a[i]a[i]是模数。

显然对于一个方程我们可以直接得到ans1=b[1]ans_1 = b[1]ans1​=b[1],用这个答案去求解第二个方程,解显然可以描述为ans2=ans1+k∗a[1]ans_2 = ans_1 + k * a[1]ans2​=ans1​+k∗a[1],所以第二个方程的解可以如下推理:

ans1+k∗a[1]≡b[2](moda[2])ans1 + k * a[1] \equiv b[2] \pmod {a[2]}ans1+k∗a[1]≡b[2](moda[2])

k∗a[1]≡b[2]−ans1(moda[2])k * a[1] \equiv {b[2] - ans1} \pmod{a[2]}k∗a[1]≡b[2]−ans1(moda[2])

所以我们只要解的kkk就行,无非就是做一次exgcdexgcdexgcd嘛,得到

ans2=ans1+k∗a[1]ans_2 = ans_1 + k * a[1]ans2​=ans1​+k∗a[1]

如果继续拓展下去,我们显然有ansk=i=1i=k−1lcm∗k+ansk−1ans_k = _{i = 1} ^ {i = k - 1} lcm * k + ans_{k - 1}ansk​=i=1i=k−1​lcm∗k+ansk−1​,也就是把上面推导的式子换成前k−1k - 1k−1项的lcmlcmlcm。

P4777 【模板】扩展中国剩余定理(EXCRT)

裸题。

/*Author : lifehappy
*/
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #include <bits/stdc++.h>#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <cmath>#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 1e5 + 10;ll a[N], b[N];
int n;ll quick_mult(ll a, ll b, ll mod) {ll ans = 0;while(b) {if(b & 1) ans = (ans + a) % mod;b >>= 1;a = (a + a) % mod;}return ans;
}ll ex_gcd(ll a, ll b, ll & x, ll & y) {if(!b) {x = 1, y = 0;return a;}ll gcd = ex_gcd(b, a % b, x, y);ll temp = x;x = y;y = temp - a / b * y;return gcd;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read();for(int i = 1; i <= n; i++) a[i] = read(), b[i] = read();ll ans = b[1], M = a[1];for(int i = 2; i <= n; i++) {ll A = M, B = a[i], C = ((b[i] - ans) % a[i] + a[i]) % a[i], x, y;ll gcd = ex_gcd(A, B, x, y);B /= gcd;x = quick_mult(x, C / gcd, B);ll mod = M * B;ans = (ans + quick_mult(x, M, mod)) % mod;M = mod;}printf("%lld\n", ((ans % M) + M) % M);return 0;
}

中国剩余定理及其拓展相关推荐

  1. 中国剩余定理学习 拓展中国剩余定理

    中国剩余定理学习 && 拓展中国剩余定理 中国剩余定理: 拓展中国剩余定理: 中国剩余定理: 仅供自己复习时查看一下大佬笔记,详细学习过程在大佬的博客. 学习连接:https://ww ...

  2. ACM数论----中国剩余定理与拓展中国剩余定理

    一.问题引入: 在<孙子算经>中有这样一个问题:"今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?"这个问 ...

  3. 中国剩余定理 及 拓展中国剩余定理模板

    求解同余方程组: { x ≡ r 1 ( m o d m 1 ) x ≡ r 2 ( m o d m 2 ) ⋯ x ≡ r n ( m o d m n ) \left\{\begin{matrix} ...

  4. 【原创】 中国剩余定理 和 拓展中国剩余定理

    孙子 Preface 数论学习Part 7. 每天进步一点点,退役不会太丢脸. 联赛只剩十五天,隔靴搔痒智何添? 剩余定理四天一篇,动归图论又几何,数据结构似云烟. 莫再等闲,莫忘时间. CRT 我们 ...

  5. 礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)

    礼物 题意: 求\[C(n,m)\ \%\ p\] \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k ...

  6. 学习拓展中国剩余定理小结

    前言 话说中国剩余定理好早就会了,但是一直木有接触过拓展的. 只知道它是个什么东东. 最近似乎需要它了,稍微学了学,似乎还挺简单的. 小结一下~ 简介 中国剩余定理我们都懂吧? 而拓展则是把它后面的模 ...

  7. 中国剩余定理拓展中国剩余定理

    复习 中国剩余定理: x ≡ a 1 ( m o d m 1 ) x ≡a_1(mod m_1) x≡a1​(modm1​) x ≡ a 2 ( m o d m 2 ) x ≡a_2(mod m_2) ...

  8. 数论-中国剩余定理(crt) 与拓展中国剩余定理(excrt)

    中国剩余定理(crt) [用途] 求方程组中最小的非负整数解X X ≡ { a 1 ( m o d m 1 ) a 2 ( m o d m 2 ) . . . a n ( m o d m n ) X\ ...

  9. 数学--数论--中国剩余定理 拓展 HDU 1788

    再次进行中国余数定理 问题描述 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡ a2(mod ...

最新文章

  1. 如何区分直连串口线和交叉串口线?
  2. Eclipse安装SVN教程
  3. Yii的errorLog
  4. 解决Eclipse Debug 的source not found问题
  5. selenium自动加载Flash
  6. canvas笔记-阴影的使用
  7. java shiro实例_spring+shiro 整合实例代码详解
  8. 这次真的谈谈如何管理一流人才
  9. CTO 说了,如果发现谁用 SELECT * 查询直接开除
  10. android整合极光im与极光推送,极光IM + 极光推送,集成中遇到的问题
  11. 查询聊天好友IP地址(自用)
  12. 为什么抖音网红城市都在西部?
  13. 手把手教你使用QGIS制作地图
  14. gRPC如何在Golang和PHP中进行实战?7步教你上手!
  15. 脑袋决定口袋,思维决定未来!
  16. R绘图笔记 | 生存曲线的绘制
  17. 合并多个文件内容到同一个文件
  18. python list 对时间排序小结。
  19. SURF(Speeded Up Robust Features)算法原理
  20. parse error, unexpected TOKBEGIN, expecting AFFECT or SEMICOLON

热门文章

  1. linux用户取消密码,[Linux]linux下取消用户名和密码直接登录
  2. mysql常用cmd指令_Mysql cmd 常用命令
  3. 语言 ota_荣威RX5 PLUS使用最新的家族设计语言,给人更年轻时尚的感觉
  4. 史上最“可怕”的数学科普,能全都看懂的只有天才!
  5. 每日一笑 | 大学教室的真实写照...
  6. 不得了,日本出版社竟是这样吸引死宅学编程的
  7. android 拍照换头像,Android调用相机拍照,裁剪及更换头像功能的实现
  8. java 线程 获取消息_获取java线程中信息
  9. oracle cpu 100%原因,oracle 12.1 cpu 100%
  10. bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?