中国剩余定理
来源:互联网 发布:siesta软件是啥 编辑:程序博客网 时间:2024/06/07 18:58
中国剩余定理
//又名“王冠博”定理。——不要问我为什么
主要用来解决一元线性同余方程组
*以下内容摘自曹冲养猪
假如有16头母猪,如果建了3个猪圈,剩下1头猪就没有地方安家了。如果建造了5个猪圈,但是仍然有1头猪没有地方去,然后如果建造了7个猪圈,还有2头没有地方去。你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?
中国【天朝】剩余定理就是解决这种问题的。
代码部分:
- 用a[]保存 取模的数,b[]保存剩下的余数
- M为 ∏a[i]
然后求解
这就用到了 Ex_gcd 求解的 x 就是取模a[i] 为 1 的值
但是需要乘 b[i] 才是答案
注意有如下两个性质
- 求得的结果满足第 i 个同余方程
- 且 mod 剩下的 a[j] 为 0 【因为M中包含了a[j]】
把所有的结果累加起来就是答案,但是注意x可能为负数,所以要+mod)%mod
Code:
#include <stdio.h>#include <string.h>#define MAXN 100typedef long long ll;ll n,x=1,y=0,ret;ll a[MAXN],b[MAXN];void Ex_gcd(ll a,ll b){ if(b==0) { x=1; y=0; } else { Ex_gcd(b,a%b); ll t=x; x=y; y=t-a/b*x; }}void CRT(){ ll M=1; //∏a[i] for(ll i=1;i<=n;i++) { M=M*a[i]; } for(ll i=1;i<=n;i++) { ll m=M/a[i]; Ex_gcd(m,a[i]); //求 (M/a[i]) * x = b[i] (Mod a[i]) x=(x%a[i]+a[i])%a[i]; ret=(ret+x*b[i]*m%M)%M; }}int main(){ scanf("%lld",&n); //条件个数 for(ll i=1;i<=n;i++) { scanf("%lld%lld",&a[i],&b[i]); // a[i] 表示 取模的数 b[i] 表示 余数 } CRT(); printf("%lld\n",ret); return 0;}
1 0
- 中国剩余定理模版【中国剩余定理】
- 中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 数论-中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 中国剩余定理
- 数论/中国剩余定理
- 关于《中国剩余定理》
- 中国剩余定理
- 模板[中国剩余定理]
- 中国剩余定理
- 超酷算法:用四叉树和希尔伯特曲线做空间索引
- 关于camera 构架设计的一点看法
- Teradata各种类型Show 语句
- SetFilePointer设置文件指针使用示例(可用于读取大文件!!!)
- app集成微信支付服务器端开发(java)
- 中国剩余定理
- JS当中获取Web访问基路径
- 在 CSS 中使用 LESS 实现更多功能
- 多线程总结(5)
- Android 滑动菜单框架完全解析
- hjtag
- with temp as
- cmos sensor camera banding 现象发生原因及相关问题
- 简单排序--插入排序