题目大意:给你一些关于$x$的方程组:
$$
\begin{cases}
x\equiv a_1\pmod{mod_1}\\
x\equiv a_2\pmod{mod_2}\\
\vdots\\
x\equiv a_n\pmod{mod_n}
\end{cases}
$$
求解$x$的最小非负整数解($\gcd(mod_1,mod_2,\cdots,mod_n)\not=1$)

题解:$EXCRT$,假设有两个方程
$$
\begin{cases}
x\equiv x_1\pmod{A}\\
x\equiv x_2\pmod{B}
\end{cases}\\
设g=\gcd(A,B),k=\left\lfloor\dfrac xg\right\rfloor,c=x\bmod g\\
x=kg+c\\
所以x_1\equiv x_2\equiv c\pmod g\\
\begin{cases}
kg+c\equiv x_1\pmod A\\
kg+c\equiv x_2\pmod B\\
\end{cases}\\
令k_1=\left\lfloor\dfrac {x_1}g\right\rfloor,k_2=\left\lfloor\dfrac {x_2}g\right\rfloor\\
\begin{cases}
kg+c\equiv k_1g+c\pmod A\\
kg+c\equiv k_2g+c\pmod B\\
\end{cases}\\
\begin{cases}
kg\equiv k_1g\pmod A\\
kg\equiv k_2g\pmod B\\
\end{cases}\\
\begin{cases}
k\equiv k_1\pmod{\left\lfloor\dfrac Ag\right\rfloor}\\
k\equiv k_2\pmod{\left\lfloor\dfrac Bg\right\rfloor}\\
\end{cases}\\
这样就可以用CRT解决了
$$
$CRT$部分见博客

卡点:

C++ Code:

#include <cstdio>
long long gcd(const long long a, const long long b) {
if (!b) return a;
return gcd(b, a % b);
}
inline long long lcm(const long long a, const long long b) { return a / gcd(a, b) * b; }
inline long long mul(const long long x, const long long y, const long long mod) {
static long long res;
res = x * y - static_cast<long long> (static_cast<long double> (x) * y / mod + 0.5) * mod;
return res + (res >> 63 & mod);
}
void exgcd(const long long a, const long long b, long long &x, long long &y) {
if (!b) x = 1, y = 0;
else exgcd(b, a % b, y, x), y -= a / b * x;
}
inline long long inv(const long long a, const long long mod) {
static long long x, y;
exgcd(a, mod, x, y);
return x + (x >> 63 & mod);
}
inline long long getreduce(const long long x, const long long mod) { return x + (x >> 63 & mod); } long long CRT(const long long A, const long long mod1, const long long B, const long long mod2) {
const long long mod = mod1 * mod2, inv1 = inv(mod1, mod2);
return getreduce(mul(mul(getreduce((B - A) % mod2, mod2), inv1, mod2), mod1, mod) + A, mod);
}
long long EXCRT(const long long A, const long long mod1, const long long B, const long long mod2) {
if (A % mod2 == B) return A;
const long long GCD = gcd(mod1, mod2), t = CRT(A / GCD, mod1 / GCD, B / GCD, mod2 / GCD);
return t * GCD + (A % GCD);
} int n;
int main() {
scanf("%d", &n);
long long LCM = 1, ans = 0;
for (int i = 0; i < n; ++i) {
static long long a, b;
scanf("%lld%lld", &a, &b); b %= a;
ans = EXCRT(ans, LCM, b, a);
LCM = lcm(LCM, a);
}
printf("%lld\n", ans);
}

最新文章

  1. Git分支管理
  2. 三分 --- CSU 1548: Design road
  3. Winform开发框架之客户关系管理系统(CRM)的开发总结系列3-客户分类和配置管理实现
  4. Xcode6与Xcode5中沙盒的变动以及偏好设置目录的变动
  5. 线程——QQ邮件发送
  6. js原生appendChild的bug
  7. Linux 命令 - mkdir: 创建目录
  8. PermGen space 与 Java heap space
  9. 倒计时 NAN 问题
  10. iOS开发——Xcode快捷键
  11. hibernate中Query的list和iterator区别(续)
  12. 【欧拉函数】BZOJ2705: [SDOI2012]Longge的问题
  13. Android studio Error: Modules no specified解决和真机调试
  14. [Paper][Link note]
  15. Java Web 学习笔记 1
  16. 域名DNS解析工具ping/nslookup/dig/host
  17. SSM集成activiti6.0错误集锦(一)
  18. apache-httpd工作模式
  19. JAVA8 Lambda初体验
  20. 【TP3.2+onethink1.0】2个Ueditor 回显数据,第2个会把第1个覆盖

热门文章

  1. spark中数据倾斜解决方案
  2. oracle 建立一个视图,然后授权其他用户访问
  3. == vs === in Javascript
  4. hugepages_settings.sh
  5. 微信小程序—day05
  6. 第一阶段&#183;Linux运维基础 第3章&#183;文件属性、正则表达式、文件权限
  7. 【转】关于cocos2dx+lua注册事件函数详解
  8. 骰子涂色 (Cube painting,UVa 253)
  9. git branch 分支与合并
  10. 20172330 2017-2018-1 《Java程序设计》第四周学习总结