当前位置: 首页 > news >正文

[poj2891]Strange Way to Express Integers(扩展中国剩余定理)

题意:求解一般模线性同余方程组

解题关键:扩展中国剩余定理求解。两两求解。

$\left\{ {\begin{array}{*{20}{l}}
{x = {r_1}\,\bmod \,{m_1}}\\
{x = {r_2}\,\bmod \,{m_2}}
\end{array}} \right.$

为了代码的符号清晰,将转化后的系数都为正,故如下设方程。

$\left\{ {\begin{array}{*{20}{l}}
{x = {r_1} - {k_1}{m_1}}\\
{x = {r_2} + {k_2}{m_2}}
\end{array}} \right.$

${r_1} - {r_2} = {k_2}{m_2} + {k_1}{m_1}$

以上其实是另一个模线性同余方程组。

考虑$ax + by = c$

由模线性同余方程的存在定理:$\gcd (a,b)|c$

$\begin{array}{l}
\frac{a}{{\gcd (a,b)}}x + \frac{b}{{\gcd (a,b)}} = \frac{c}{{\gcd (a,b)}}\\
x \equiv {(\frac{a}{{\gcd (a,b)}})^{ - 1}}\frac{c}{{\gcd (a,b)}}\bmod (\frac{b}{{\gcd (a,b)}})
\end{array}$

 回归原式:

$x$即为${k_1}$

推出原式中的$x$

$x = {r_1} - {k_1}{m_1} = {r_1} - {m_1}{(\frac{{{m_1}}}{{\gcd ({m_1},{m_2})}})^{ - 1}}\frac{{{r_2} - {r_1}}}{{\gcd ({m_1},{m_2})}}\bmod \frac{{{m_1}{m_2}}}{{\gcd ({m_1},{m_2})}}$

一般化这个结论,模数即为lcm,可直接记住

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<iostream>
 7 using namespace std;
 8 typedef long long ll;
 9 ll x,y,r[20002],m[20002],n;
10 ll extgcd(ll a,ll b,ll &x,ll &y){
11     ll d=a;
12     if(b)   d=extgcd(b,a%b,y,x),y-=a/b*x;
13     else  x=1,y=0;
14     return d;
15 }
16 ll excrt(int n,ll *m,ll *r){
17     ll M=m[0],pre=r[0],d;//a是模数 
18     for(int i=1;i<n;i++){
19         d=extgcd(M,m[i],x,y);
20         if((pre-r[i])%d!=0) return -1;
21         x=(pre-r[i])/d*x%m[i];
22         pre-=x*M;
23         M=M/d*m[i];//lcm 
24         pre%=M;
25     }
26     return (pre%M+M)%M;
27 }
28 int main(){
29     ios::sync_with_stdio(0);
30     while(cin>>n){
31         for(int i=0;i<n;i++) cin>>m[i]>>r[i];
32         ll ans=excrt(n,m,r);
33         printf("%lld\n",ans);
34     } 
35 }

 

转载于:https://www.cnblogs.com/elpsycongroo/p/7617436.html

相关文章:

  • 20162312实验一
  • Jzoj3882 近邻
  • C#.NET常见问题(FAQ)-如何使用右下角托盘图标notifyIcon
  • oracle 分组查询
  • 【t018】派对
  • 【t004】切割矩阵
  • idea中构建maven项目时控制台乱码的解决办法
  • 【record】10.30..11.6
  • 跳跃表原理和实现
  • 【Linux】命令——网络管理
  • python初学-元组、集合
  • 读Zepto源码之Fx模块
  • JS_dom_自定义对象
  • [CQOI 2010]扑克牌
  • 判断是否为汉字
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • JAVA 学习IO流
  • java8-模拟hadoop
  • MySQL的数据类型
  • Vue官网教程学习过程中值得记录的一些事情
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端面试总结(at, md)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #1014 : Trie树
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (4)(4.6) Triducer
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)fread与fwrite详解
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (转)VC++中ondraw在什么时候调用的
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 读取 JSON格式的数据
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net中生成excel后调整宽度
  • @hook扩展分析
  • @我的前任是个极品 微博分析
  • [ C++ ] STL---string类的使用指南
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [ARC066F]Contest with Drinks Hard
  • [C/C++]数据结构 栈和队列()
  • [C\C++]读入优化【技巧】
  • [HackMyVM]靶场 VivifyTech
  • [hdu 3652] B-number
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式