【洛谷 P4777】 【模板】扩展中国剩余定理(EXCRT)
2024-08-24 15:17:15
注意一下::
题目是
\[x≡b_i\pmod {a_i}
\]
\]
我总是习惯性的把a和b交换位置,调了好久没调出来,\(qwq\)。
本题解是按照
$$x≡a_i\pmod {b_i}$$
讲述的,请注意
本题\(m_i\)不一定两两互质,所以中国剩余定理在本题不再适用。
说是扩展中国剩余定理,其实好像和中国剩余定理关系不大。
使用数学归纳法,如果我们已经知道了前\(k-1\)个方程组构成的一个解,记作\(x\),记\(m=\Pi_{i=1}^{k-1}m_i\),则\(x+i*m(i∈Z)\)是前\(k-1\)个方程的通解,如果这个不懂,就得去好好学学同余了。考虑对于第\(k\)个方程,求出一个\(t\),使得
\[x+t*m≡a_i \pmod {b_i}
\]
\]
然后
\[x'=x+t*m
\]
\]
综上,循环\(n\)次即可。
讲一下如何用扩展欧几里德解线性同余方程。
大家都知道(假设大家都知道),\(exgcd\)可以求出方程
\[ax+by=gcd(a,b)
\]
\]
的一组整数解。
我们要解的线性同余方程是这样的:
\[ax≡b\pmod m
\]
\]
可以写成这个形式:
\[ax+my=b
\]
\]
若方程有解,则
\[gcd(a,m)|b
\]
\]
一定成立。题目保证有解,无需特判。
于是我们用扩欧求出
\[ax+my=gcd(a,b)
\]
\]
的一组解,然后等式两边同时除以\(gcd\)再乘以\(b\),得
\[a(x/gcd(a,b)*b)+m(y/gcd(a,b)*b)=b
\]
\]
得解。
还有个细节,就是乘的时候会爆long long,而__int128这个东西比赛时是不可用的,所以还是老老实实打快\((gui)\)速乘吧。
其实和快速幂差不多的。
ll Slow_Mul(ll n, ll k, ll mod){
ll ans = 0;
while(k){
if(k & 1) ans = (ans + n) % mod;
k >>= 1;
n = (n + n) % mod;
}
return ans;
}
完整\(AC\)代码:
#include <cstdio>
const int MAXN = 100010;
typedef long long ll;
int n;
ll a[MAXN], b[MAXN], ans, M, x, y;
ll exgcd(ll a, ll b, ll &x, ll &y){
if(!b){ x = 1; y = 0; return a; }
ll d = exgcd(b, a % b, x, y);
ll z = x; x = y; y = z - (a / b) * y;
return d;
}
ll Slow_Mul(ll n, ll k, ll mod){
ll ans = 0;
while(k){
if(k & 1) ans = (ans + n) % mod;
k >>= 1;
n = (n + n) % mod;
}
return ans;
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%lld%lld", &b[i], &a[i]);
ans = a[1];
M = b[1];
for(int i = 2; i <= n; ++i){
ll B = ((a[i] - ans) % b[i] + b[i]) % b[i];
ll GCD = exgcd(M, b[i], x, y);
x = Slow_Mul(x, B / GCD, b[i]);
ans += M * x;
M *= b[i] / GCD;
ans = (ans + M) % M;
}
printf("%lld\n", ans);
return 0;
}
最新文章
- 为什么volatile不能保证原子性而Atomic可以?
- UWP webview 键盘bug,回退页面,键盘会弹一下。
- Mvc利用淘宝Kissy uploader实现图片批量上传附带瀑布流的照片墙
- AngularJS快速入门指南20:快速参考
- MyEclipse8.5破解方法
- AMD64与IA64的区别
- codeblocks 配置交叉编译和调试环境
- urllib2中自定义opener
- [React Testing] Setting up dependencies &;&; Running tests
- WeChatAPI 开源系统架构详解
- LPC1788做U盘的时候对命令的响应
- Laptop Ubuntu16.04/14.04 安装Nvidia显卡驱动
- 6年后的第一篇博客:进入java的精彩世界
- Actor消息发送及等待结果关键字
- react-native 导航器 react-navigation 3.x 使用
- LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++
- Java实现敏感词过滤 - DFA算法
- javascript五种基本类型
- Socket进程通信机制
- Spark MLlib 之 大规模数据集的相似度计算原理探索
热门文章
- 【数据库】 SQL 使用注意点
- hihoCoder 1175:拓扑排序二
- Mysql性能优化一:SQL语句性能优化
- 图的同构 (Graph Isomorphism)
- java设计模式之门面模式以及在java中作用
- Week2 Teamework from Z.XML 软件分析与用户需求调查(四)Bing桌面及助手的现状与发展
- 【WebService】——契约优先
- 微信小程序小程序使用scroll-view不能使用下拉刷新的解决办法
- [LOJ #2538][PKUWC 2018]Slay the Spire
- BZOJ3289 Mato的文件管理 【莫队 + 树状数组】