【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 ...
随机推荐
- leetcode第一刷_Minimum Depth of Binary Tree
非常easy的题目.只是还是认为要说一下. 最小深度.非常快想到bfs,层序遍历嘛.本科的时候实在是没写过多少代码,一開始竟然想不到怎么保存一层的信息.后来想到能够压入一个特殊的对象,每次到达这个对象 ...
- 求int型数据在内存中存储时1的个数
1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> u ...
- 使用Lucene对预处理后的文档进行创建索引(可执行)
时间: 2015/3/18 杨鑫newlife 对于文档的预处理后.就要開始使用Lucene来处理相关的内容了. 这里使用的Lucene的过程例如以下: 首先要为处理对象机那里索引 二是构建查询对象 ...
- luogu1072 Hankson的趣味题
题目大意 给出数a0, a1, b0, b1,求满足gcd(a0, x)=a1, lcm(b0, x)=b1的x的个数 解法一 枚举b1的因数,看看是否满足上述条件. 怎样枚举因数 试除法.对于1~s ...
- Ubuntu Tomcat Service
只需要将%TOMCAT_HOME%/bin/catalina.sh文件拷贝到/etc/init.d/文件夹下,稍作编辑,然后注册成系统服务,是否设置自启动均可. 1. 编辑catalina.sh文件c ...
- ijkplayer视频播放
http://android-doc.com/androiddocs/2017/1018/5416.html https://www.2cto.com/kf/201801/714366.html ...
- 杂项: EasyUI | jQuery EasyUI
ylbtech-杂项-JS: EasyUI | jQuery EasyUI jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻 ...
- 抽象类(abrstract class)与接口(interface)有何异同
抽象类:如果一个类中包含抽象方法(用abstract修饰的方法),那么这个类就是抽象类 接口:是指一个方法的集合,接口中的所有方法都没有方法体 相同点: 1)都不能被实例化 2)接口的实现类或抽象类的 ...
- ansible upload
# 链接地址:https://www.cnblogs.com/xiaoxiaoleo/p/6626299.html # synchronize: 从拉取远程服务器文件,需要加mode: pull # ...
- javascript中的原型对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...