【同余方程组】POJ1006 生理周期
同余方程组:
先来看一道题目:有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何? 然后我们可以做如下变换,设x为所求的数。
x%3=2 x ≡ a1(%m1) ①
x%5=3 ===> x ≡ a2(%m2) ②
x%7=2 x ≡ a3(%m3)
根据前面两式可以得到
x = a1+m1y1 (1)
x = a2+m2y2
两式相减得到 m1y1 - m2y2 = a2 - a1 这是一个线性不定方程,可解出y1 ---> linearEquation(m1,-m2,a2-a1) 带回(1),得特解x0 = a1+m1*y1 --> 得到通解表达式 x =x0 + k*lcm(m1,m2) 得一个新方程 x = x0 (mod lcm(m1,m2))
代码:
/**
*
* @param a 余数组成的数组
* @param m 模组成的数组
* @return
* @throws Exception
*/
public static long linearEquationGroup(Long[] a, Long[] m) throws Exception {
int len = a.length;
if (len == 0 && a[0] == 0)
return m[0]; for (int i = 1; i < len; i++) {
// 这里往前看是两个方程
long a2_a1 = a[i] - a[i - 1];
long d = linearEquation(m[i - 1], -m[i], a2_a1);
// 现在的x是y1,用y1求得一个特解
long x0 = a[i - 1] + m[i - 1] * x;
long lcm = m[i - 1] * m[i] / d;
a[i] = (x0 % lcm + lcm) % lcm;// x0变成正数
m[i] = lcm;
}
// 合并完之后,只有一个方程 : x = a[len-1] (% m[len-1])
//long d = linearEquation(1, m[len-1], a[len-1]);
return a[len - 1] % m[len - 1];
}
题目:POJ1006 生理周期


代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class POJ1006 { public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int t = 1;
List<Long[]> aList = new ArrayList<Long[]>();
List<Long> dList = new ArrayList<Long>();
while(scanner.hasNext()){
Long []a = {scanner.nextLong(),scanner.nextLong(),scanner.nextLong()};
Long d = scanner.nextLong();
if (a[0]==-1&&a[1]==-1&&a[2]==-1&&d==-1) {
break;
}else {
aList.add(a);
dList.add(d);
}
}
for (int i = 0; i < aList.size(); i++) {
Long[] a = aList.get(i);
long d = dList.get(i);
Long[] m = { (long) 23, (long) 28, (long) 33 };
long res = MyGcd.linearEquationGroup(a, m);
while (res <= d) {
res += 21252;
}
System.out.println("Case " + (t++) + ": the next triple peak occurs in " + (res - d) + " days.");
}
} private static class MyGcd {
static long x;
static long y; /**
*
* @param a 余数组成的数组
* @param m 模组成的数组
* @return
* @throws Exception
*/
public static long linearEquationGroup(Long[] a, Long[] m) throws Exception {
int len = a.length;
if (len == 0 && a[0] == 0)
return m[0]; for (int i = 1; i < len; i++) {
// 这里往前看是两个方程
long a2_a1 = a[i] - a[i - 1];
long d = linearEquation(m[i - 1], -m[i], a2_a1);
// 现在的x是y1,用y1求得一个特解
long x0 = a[i - 1] + m[i - 1] * x;
long lcm = m[i - 1] * m[i] / d;
a[i] = (x0 % lcm + lcm) % lcm;// x0变成正数
m[i] = lcm;
}
// 合并完之后,只有一个方程 : x = a[len-1] (% m[len-1])
//long d = linearEquation(1, m[len-1], a[len-1]);
return a[len - 1] % m[len - 1];
} public static long inverseElement(long a, long mo) throws Exception { long d = linearEquation(a, mo, 1);
x = (x % mo + mo) % mo;
return d;
} public static long linearEquation(long a, long b, long m) throws Exception {
long d = ext_gcd(a, b);
// m不是gcd(a,b)的倍数,这个方程无解
if (m % d != 0)
throw new Exception("无解");
long n = m / d;// 约一下,考虑m是d的倍数
x *= n;
y *= n;
return d;
} public static long ext_gcd(long a, long b) { if (b == 0) {
x = 1;
y = 0;
return a;
}
long res = ext_gcd(b, a % b);
long x1 = x;// 备份x
x = y;// 更新x
y = x1 - a / b * y;// 更新y
return res;
} } }
结果:

【同余方程组】POJ1006 生理周期的更多相关文章
- poj1006 生理周期
生理周期 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 138947 Accepted: 44597 Descripti ...
- 【数论】【中国剩余定理】poj1006 生理周期
CRT用于求解一元线性同余方程组(模数互质),实际上模数不互质我们也可以解决,在之前的某篇文章里提过.如下 http://www.cnblogs.com/autsky-jadek/p/6596010. ...
- poj1006生理周期(中国剩余定理)
生理周期 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 139224 Accepted: 44687 Descripti ...
- poj1006生理周期(中国剩余定理)
/* 中国剩余定理可以描述为: 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: x=R1r1+R2r2+…+Rnrn+RD 其中R1是d2.d3.….dn的公倍数,而 ...
- [POJ1006]生理周期 (中国剩余定理)
蒟蒻并不会中国剩余定理 交的时候还出现了PE的错误 下面是AC代码 #include<iostream> #include<cstdio> using namespace st ...
- OpenJ_Bailian 4148 生理周期
生理周期 OpenJ_Bailian - 4148 Time limit1000 ms Memory limit65536 kB OS Linux SourceEast Central North A ...
- 生理周期[PKU1006]
生理周期 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 132195 Accepted: 42171 Descripti ...
- 生理周期(c++实现)
描述:人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23 天. 28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维 ...
- ACM第二题 生理周期
人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易 ...
随机推荐
- Python爬去有道翻译
注:传入的类型为POST类型,所以需要使用urllib.parse.urlencode(),将字典转换成URL可用参数: 使用json.loads(),将输出的json格式,转换为字典类型 impor ...
- 【原创】beyond compare 解决文件一样,对比有差异的问题
在beyond compare的5~6年的使用过程中突然有一天发现,beyond compare对比的文件都一样,但是却都显示红色!很是烦人. 这是因为beyond compare一开始对比的时时间, ...
- 敏捷开发相关编辑思想(SOA、DDD、REST、CQRS)
这是第一次写有关编程思想的东西. 1.理解Martin Fowler提出的SOA(面向服务歧义) 2.理解DDD(Domain-Driven Design领域驱动设计): http://blog.cs ...
- 2018-2019-3 网络对抗技术 20165235 Exp3 免杀原理与实践
2018-2019-3 网络对抗技术 20165235 Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 1.对某个文件的特征码进行分析,(特征码就是一类恶意文件中经常出现的一段代 ...
- Linux-day2-上课笔记
UGO权限 1) 文件对于拥有者的权限 User 2) 文件对于所属组里面的用户的权限 Group 3) 文件对于其他人的权限 Others 对于文件的权限 1)对于文件可读 r 2)对于文件 ...
- 2018年多校第四场第二题 B. Harvest of Apples hdu6333
题意:给定10^5以内的n,m求∑组合数(n,i),共10^5组数据. 题解: 定义 S(n, m) = \sum_{i = 0} ^ {m} {n \choose i}S(n,m)=∑i=0m ...
- navigator的一些冷知识
{ 监听屏幕旋转变化接口: orientationchange orientation.angle : 0 竖屏 , 90 向左横屏 , -90/270 向右横屏 , 180 倒屏 } screenO ...
- 3dmax 3dmax计算机要求 3dmax下载
渲染首先是要X64兼容台式电脑,笔记本不行,笔记本就是学生拿来玩还行,渲染大图笔记本真的是发热. 配置一般的电脑和笔记本千万不要尝试安装3dmax2019了,很卡的,3dmax2019只有64位,没有 ...
- Ubuntu Server 12.04(14.04) 静态IP简洁配置
1.配置静态IP地址: # vim /etc/network/interfaces 原内容有如下4行:auto loiface lo inet loopback auto eth0iface eth0 ...
- 大数加法~HDU 1002 A + B Problem II
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1002 题意: 数学题,A+B; 思路,这个数非常大,普通加法一定会超时,所以用大数加法.大数加法的基 ...