【hihocoder 1303】模线性方程组
【题目链接】:http://hihocoder.com/problemset/problem/1303
【题意】
【题解】
/*
x % m[1] = r[1]
x % m[2] = r[2]
x = k[1]*m[1]+r[1] ···①
x = k[2]*m[2]+r[2] ···②
k[1]*m[1]+r[1]=k[2]*m[2]+r[2]
m[1]*k[1]-m[2]*k[2]=r[2]-r[1]
令A=m[1],B=m[2],C=r[2]-r[1],x=k[1],y = -k[2];
A*x+B*y=C
令t = gcd(A,B)
如果C%t!=0则无解
令A'=A/t,B'=B/t,C'=C/t
A'*x+B'y=C'
对于A'x+B‘y=1
求出x0,然后乘上C;
就是A'x+B'y=C'的一个特解了
x0 = x0*C;
然后这个时候x0可能为负值吧;
所以求最小的正值;
x0 = (x0%B'+B')%B';
就能算出来k[1],也即k[1]=x0,;
带回①式
x0= x0*m[1]+r[1]
将x0作为特解;
得到一个解系
x = x0+t*lcm(m[1],m[2]);
这样就相当于得到一个新的方程
X % lcm(m[1],m[2]) == x0
令M = lcm(m[1], m[2]), R = x0,则有新的模方程X mod M = R。
此时,可以发现我们将x mod m[1] = r[1],x mod m[2] = r[2]
合并为了一个式子X mod lcm(m[1], m[2]) = x。满足后者的X一定
满足前两个式子。
这里x0也取最小的正值吧
x0 = x0%lcm(m[1],m[2]);
if (x0<lcm(m[1],m[2])) x0+=lcm(m[1],m[2]);
如果再有一个方程
X % m[3] = r[3]
则可以再用相同的方法求出它的解系
最后输出那个x0就好了
*/
【Number Of WA】
2
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 110;
int n;
LL m1,r1,m2,r2;
LL gcd(LL a,LL b)
{
if (b==0)
return a;
else
return gcd(b,a%b);
}
void ex_gcd(LL a,LL b,LL &x,LL &y)
{
if (b==0)
{
x = 1,y = 0;
return;
}
ex_gcd(b,a%b,y,x);
y-=a/b*x;
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
cin >> n;
cin >> m1 >> r1;
rep1(i,2,n)
{
cin >> m2 >> r2;
LL A = m1,B = m2,C = r2-r1;
LL t = gcd(m1,m2);
if (C%t!=0) return cout << -1 << endl,0;
A/=t,B/=t,C/=t;
LL x0,temp;
ex_gcd(A,B,x0,temp);
x0=(C*x0%B+B)%B;//求出A'x+B'y=C'的最小的正值特解
x0 = x0*m1+r1;//x0=k[1],回带出模线性方程组的特解
LL lcm = m1/t*m2;
x0 = x0%lcm;
if (x0<0) x0+=lcm;//求出特解里面的最小正值
m1 = lcm,r1 = x0;
if (i==n) cout << x0 << endl;
}
return 0;
}
【hihocoder 1303】模线性方程组的更多相关文章
- hihoCoder 1303 数论六·模线性方程组
Description 求解模线性方程组, \(m_i\) 不互质. Sol 扩展欧几里得+中国剩余定理. 首先两两合并跟上篇博文一样. 每次通解就是每次增加两个数的最小公倍数,这对取模任意一个数都是 ...
- hiho一下 第九十七周 数论六·模线性方程组
题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军 ...
- Strange Way to Express Integers (一般模线性方程组)
Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 8476 Accepted: 2554 Description Elin ...
- POJ 1061 青蛙的约会(拓展欧几里得算法求解模线性方程组详解)
题目链接: BZOJ: https://www.lydsy.com/JudgeOnline/problem.php?id=1477 POJ: https://cn.vjudge.net/problem ...
- hdu 5755(高斯消元——模线性方程组模板)
PS. 看了大神的题解,发现确实可以用m个未知数的高斯消元做.因为确定了第一行的情况,之后所有行的情况都可以根据第一行推. 这样复杂度直接变成O(m*m*m) 知道了是高斯消元后,其实只要稍加处理,就 ...
- HDU.3571.N-dimensional Sphere(高斯消元 模线性方程组)
题目链接 高斯消元详解 /* $Description$ 在n维空间中给定n+1个点,求一个点使得这个点到所有点的距离都为R(R不给出).点的任一坐标|xi|<=1e17. $Solution$ ...
- POJ.2065.SETI(高斯消元 模线性方程组)
题目链接 \(Description\) 求\(A_0,A_1,A_2,\cdots,A_{n-1}\),满足 \[A_0*1^0+A_1*1^1+\ldots+A_{n-1}*1^{n-1}\equ ...
- poj 2891 模线性方程组求解
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 8005 ...
- POJ 2981 Strange Way to Express Integers 模线性方程组
http://poj.org/problem?id=2891 结果看了半天还是没懂那个模的含义...懂了我再补充... 其他的思路都在注释里 /********************* Templa ...
随机推荐
- 歌乐电子一道非常easy的笔试题目居然搞错了!!!
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjI0NzQ2Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 零基础学python-2.24 一些经常使用函数
今天我举一些经常使用的函数,让大家了解一下: 函数 作用 dir([obj]) 浏览对象的属性 help([obj]) 显示对象的文档字符串 ini([obj]) 将对象转为整形 len([obj]) ...
- UVa 572 - Oil Deposits (简单dfs)
Description GeoSurvComp地质调查公司负责探測地下石油储藏. GeoSurvComp如今在一块矩形区域探測石油.并把这个大区域分成了非常多小块.他们通过专业设备.来分析每一个小块中 ...
- EOJ 3348 树的顺序存储结构
前面介绍了树的链式存储结构,那么如何用顺序存储来存储一棵树呢?在顺序存储时,我们除了存储每个结点值外,还要存储树中结点与结点之间的逻辑关系(即双亲与孩子结点之间的关系).下面介绍树的双亲存储法. 编号 ...
- js设计模式-享元模式
享元模式实际上是一种优化模式,目的在于提高系统的性能和代码的效率. 使用享元模式的条件:最重要的条件是网页中必须使用了大量资源密集型对象,如果只会用到了少许这类对象,那么这种优化并不划算.第二个条件是 ...
- codeforces 708ALetter Cyclic Shift
2019-05-18 09:51:19 加油,加油,fightting !!! https://www.cnblogs.com/ECJTUACM-873284962/p/6375011.html 全为 ...
- Selenium的文件上传JAVA脚本
在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = drive ...
- oracle数据库rman备份与还原
我是oracle 界的小白,由于公司领导要求,不得不硬着头皮在网上找rman备份还原的方法,废话不多说,具体看例子(window) 运行CMD: rman target 管理员账号/密码@orcl 备 ...
- C# CultureInfo.InvariantCulture
今天在写代码的过程中发现了一个有意思的问题,我在写了一个日期格式转化的时候发现不同电脑的运行结果不一致. 代码如下 string str = this.tbTime.Text; if(string.I ...
- 创建一个netcore2.0和angular的项目并运行起来
netcore2.0发布了,喜大普奔. 我们先下载SDK,请看张善友老师的这篇博客 http://www.cnblogs.com/shanyou/p/7363037.html 下载完之后 我用的vs2 ...