【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 ...
随机推荐
- formValidator向struts2 ajax传參验证
话不多说,直接上代码 页面head里面的formvalidator验证配置 <script type="text/javascript"> $(document).re ...
- 编写MyLayer,2 锚点,3 精灵的创建,4 zorder
1 编写MyLayer 头文件:MyLayer.h #include "cocos2d.h" USING_NS_CC; //代表的是: using namespace c ...
- 单片机小白学步系列(十四) 点亮第一个LED的程序分析
本篇我们将分析上一篇所写的程序代码.未来学习单片机的大部分精力,我们也将放在程序代码的编写上. 可是不用操心.我会很具体的介绍每一个程序的编写思路和各种注意事项等. 之前我们写的程序例如以下: #in ...
- WndProc函数参数列表
protected override void WndProc(ref Message m) 实现了这一点. 重写WndProc函数,可以捕捉所有窗口发生的消息.这样,我们就可以"篡改&qu ...
- 使用美橙主机建站(jsp+mysql+tomcat建站)
1.注冊美橙互联账号:http://www.cndns.com/ 2.选择橙云主机: 3.选择你须要的主机类型. 3.能够随时与客服进行沟通.购买完毕后登陆 管理中心 4.点击左边 主机类管理--&g ...
- luogu1072 Hankson的趣味题
题目大意 给出数a0, a1, b0, b1,求满足gcd(a0, x)=a1, lcm(b0, x)=b1的x的个数 解法一 枚举b1的因数,看看是否满足上述条件. 怎样枚举因数 试除法.对于1~s ...
- linux下udev简介【转】
本文转载自:http://blog.csdn.net/skyflying2012/article/details/9364555 一.关于Udev u即user space,dev是device,通过 ...
- 【POJ 2044】 Weather Forecast
[题目链接] http://poj.org/problem?id=2044 [算法] 广度优先搜索 [代码] #include <algorithm> #include <bitse ...
- 使用WebGL + Three.js制作动画场景
使用WebGL + Three.js制作动画场景 3D图像,技术,打造产品,还有互联网:这些只是我爱好的一小部分. 现在,感谢WebGL的出现-一个新的JavaScriptAPI,它可以在不依赖任何插 ...
- 获取listview的高度代码
public int getTotalHeightofListView(ListView listView) { ListAdapter mAdapter = (ListAdapter) listVi ...