hiho一下 第九十七周 数论六·模线性方程组
题目1 : 数论六·模线性方程组
描述
小Ho:今天我听到一个挺有意思的故事!
小Hi:什么故事啊?
小Ho:说秦末,刘邦的将军韩信带领1500名士兵经历了一场战斗,战死四百余人。韩信为了清点人数让士兵站成三人一排,多出来两人;站成五人一排,多出来四人;站成七人一排,多出来六人。韩信立刻就知道了剩余人数为1049人。
小Hi:韩信点兵嘛,这个故事很有名的。
小Ho:我觉得这里面一定有什么巧妙的计算方法!不然韩信不可能这么快计算出来。
小Hi:那我们不妨将这个故事的数学模型提取出来看看?
小Ho:好!
<小Ho稍微思考了一下>
小Ho:韩信是为了计算的是士兵的人数,那么我们设这个人数为x。三人成排,五人成排,七人成排,即x mod 3, x mod 5, x mod 7。也就是说我们可以列出一组方程:
x mod 3 = 2
x mod 5 = 4
x mod 7 = 6
韩信就是根据这个方程组,解出了x的值。
小Hi:嗯,就是这样!我们将这个方程组推广到一般形式:给定了n组除数m[i]和余数r[i],通过这n组(m[i],r[i])求解一个x,使得x mod m[i] = r[i]。
小Ho:我怎么感觉这个方程组有固定的解法?
小Hi:这个方程组被称为模线性方程组。它确实有固定的解决方法。不过在我告诉你解法之前,你不如先自己想想怎么求解如何?
小Ho:好啊,让我先试试啊!
输入
第1行:1个正整数, N,2≤N≤1,000。
第2..N+1行:2个正整数, 第i+1行表示第i组m,r,2≤m≤20,000,000,0≤r<m。
计算过程中尽量使用64位整型。
输出
第1行:1个整数,表示满足要求的最小X,若无解输出-1。答案范围在64位整型内。
- 样例输入
-
3
3 2
5 3
7 2 - 样例输出
-
23
解答:
一开始没看提示,想的是暴力法,输出满足n个式子的x值,果然提交了,AC不了,超时。赋下超时代码:
#include "iostream"
#define MAX 20000000 using namespace std; typedef long long LL; LL m[MAX], r[MAX], n, k; int main()
{
cin>>n; if(n<)
return -; for (int i = ; i<n; i++)
cin >> m[i] >> r[i]; for(int i=;i<MAX;i++){
k = ;
for (int j = ; j < n; j++){
if(i%m[j]==r[j])
k++;
}
if (k == n){
cout << i << endl;
system("pause");
}
}
}期间还出现了个小问题,定义超大数组的时候提示栈溢出。
,如果放在main函数里面,栈会overflow。
因为局部变量存在栈上,一般大小2m,所以会溢出,,,定义成全局变量或static的话,就ok了,大小由系统决定。
AC代码:
#include "iostream"
#define MAX 20000000 using namespace std; typedef long long LL; LL m[MAX], r[MAX], n ; LL gcd(LL a, LL b){
if (b == )
return a;
return gcd(b, a%b);
} void extend_gcd(LL a, LL b, LL &x, LL &y){
if (b == ){
x = ;
y = ;
return ;
} LL x1, y1;
extend_gcd(b, a%b, x1, y1);
x = y1;
y = x1 - (a / b)*y1;
} LL Solve()
{
LL M = m[], R = r[], d, k1, k2, c;
for (int i = ; i <= n; i++)
{
d = gcd(M, m[i]);
c = r[i] - R;
if (c % d)
return -; // 无解的情况
extend_gcd(M / d, m[i] / d, k1, k2);
k1 = (c / d*k1) % (m[i] / d); // 计算x = m[1] * k[1] + r[1]
R = R + k1*M; // 求解lcm(M, m[i])
M = M / d*m[i]; // 求解合并后的新R,同时让R最小
R %= M;
}
if (R < )
R = R + M;
return R;
} int main()
{
cin >> n; for (int i = ; i <= n; i++)
cin >> m[i] >> r[i];
cout << Solve() << endl; system("pause");
}
hiho一下 第九十七周 数论六·模线性方程组的更多相关文章
- hihoCoder 1303 数论六·模线性方程组
Description 求解模线性方程组, \(m_i\) 不互质. Sol 扩展欧几里得+中国剩余定理. 首先两两合并跟上篇博文一样. 每次通解就是每次增加两个数的最小公倍数,这对取模任意一个数都是 ...
- hiho一下 第九十四周 数论三·约瑟夫问题
数论三·约瑟夫问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho的班级正在进行班长的选举,他们决定通过一种特殊的方式来选择班长. 首先N个候选人围成一个 ...
- hihocode 九十七周 中国剩余定理
题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军 ...
- 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point
// 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point // 思路:直接暴力绝对T // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再 ...
- 201771010134杨其菊《面向对象程序设计(java)》第十七周学习总结
第十七周学习总结 1. 程序是一段静态的代码,它是应用程序执行的蓝本.进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程.操作系统为每个进程分配一段独立的内存空间和系统资源,包 ...
- “Hello World!”团队第六周第六次会议
“Hello World!”团队第六周第六次会议 博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout& ...
- “Hello World!”团队第五周第六次会议
“Hello World!”团队第五周第六次会议 博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout& ...
- “全栈2019”Java第九十七章:在方法中访问局部内部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- hiho一下 第115周:网络流一•Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)
来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快. hi ...
随机推荐
- XAMPP里tomcat启动报错:Make sure you have Java JDK or JRE installed and the required ports are free
以前用XAMPP的时候就是自然而然装好了就可以用,最近重装了新系统,打算在Windows 10里面配置Apache tomcat.PHP.MySQL的开发环境,迟迟试验不成功,于是直接用了XAMPP, ...
- angular(常识)
我觉得angularjs是前端框架,而jquery只是前端工具,这两个还是没有可比性的. 看知乎上关于jquery和angular的对比http://www.zhihu.com/question/27 ...
- [USACO2005][POJ2228]Naptime(对特殊环状DP的处理)
题目:http://poj.org/problem?id=2228 题意:将一天分为N小时,每小时都有一个价值w,有一头牛要睡觉,而它的睡觉是连续的,且第一小时不能算价值,即如果你睡了[a,b],则你 ...
- 第四十三课:jQuery插件化
我们先来看一个最简单的例子: (function($){ $.fn.extend({ //把此插件添加到jQuery的原型上 pluginName:function(){ //插件的名字 ...
- “耐撕”团队 2016.04.07 站立会议
1. 时间: 20:00--20:15 共计20分钟. 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:ht ...
- 理解jar
对于大多数 Java 开发人员来说,JAR 文件及其 “近亲” WAR 和 EAR 都只不过是漫长的 Ant 或 Maven 流程的最终结果.标准步骤是将一个 JAR 复制到服务器(或者,少数情况下是 ...
- 快速安装 GitLab 并汉化
转载:http://www.jianshu.com/p/7a0d6917e009
- SSH配置文件和SSM配置文件的写法
一.SSH配置文件的写法(XML版本) <util:properties id="jdbc" location="classpath:db.properties&q ...
- config 写入
d代码: # __author__ = liukun # coding:utf-8 line = input("please input the config \n :") #提示 ...
- Oracle分页查询语句
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM (此处添加你要分页的表)) A WHERE ROWNUM <= 14000)WH ...