同余方程组:

  先来看一道题目:有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何?  然后我们可以做如下变换,设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 生理周期的更多相关文章

  1. poj1006 生理周期

    生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 138947   Accepted: 44597 Descripti ...

  2. 【数论】【中国剩余定理】poj1006 生理周期

    CRT用于求解一元线性同余方程组(模数互质),实际上模数不互质我们也可以解决,在之前的某篇文章里提过.如下 http://www.cnblogs.com/autsky-jadek/p/6596010. ...

  3. poj1006生理周期(中国剩余定理)

    生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 139224   Accepted: 44687 Descripti ...

  4. poj1006生理周期(中国剩余定理)

    /* 中国剩余定理可以描述为: 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: x=R1r1+R2r2+…+Rnrn+RD 其中R1是d2.d3.….dn的公倍数,而 ...

  5. [POJ1006]生理周期 (中国剩余定理)

    蒟蒻并不会中国剩余定理 交的时候还出现了PE的错误 下面是AC代码 #include<iostream> #include<cstdio> using namespace st ...

  6. OpenJ_Bailian 4148 生理周期

    生理周期 OpenJ_Bailian - 4148 Time limit1000 ms Memory limit65536 kB OS Linux SourceEast Central North A ...

  7. 生理周期[PKU1006]

    生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 132195   Accepted: 42171 Descripti ...

  8. 生理周期(c++实现)

    描述:人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23 天. 28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维 ...

  9. ACM第二题 生理周期

    人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易 ...

随机推荐

  1. CSS动画:animation、transition、transform、translate

    https://blog.csdn.net/px01ih8/article/details/80780470 一.区分容易混淆的几个属性和值 先区分一下css中的几个属性:animation(动画). ...

  2. 集腋成裘-13-git使用-02进阶篇

    上一篇我们简单介绍了如何安装和使用git,本次将简单介绍如何创建分支.处理冲突.提交与回滚 创建和合并分支是Git的一大特色. 使用场景:当有一个新功能要开发,但是又没有确定上线时间,不能合并到主干上 ...

  3. CentOS openssh升级到openssh可用

    1. https://blog.csdn.net/moonpure/article/details/54575401 2. http://www.it165.net/admin/html/201303 ...

  4. Extjs4.2 GridPanel中显示单选按钮

    效果:如上图. 代码:其中需要显示单选按钮的列 { dataIndex: 'FeeModel', text: '收費模式', flex: 1, align: 'left', radioValues: ...

  5. 大数据学习之hdfs集群安装部署04

    1-> 集群的准备工作 1)关闭防火墙(进行远程连接) systemctl stop firewalld systemctl -disable firewalld 2)永久修改设置主机名 vi ...

  6. Hive的DDL操作

    DDL:data definittion language 数据定义语言 主要是定义或改变表的结构.数据类型.表之间的链接和约束等初始化操作 DML:data manipulation languag ...

  7. python_str的应用

    name = "fsafalk" #nam是个变量名  fsafalk是变量  也是字符串 name.startswith('fs')#判断是否是fs开头 name.endswit ...

  8. websocket与ajax的区别浅析

    1.本质不同  Ajax,即异步JavaScript和XML,是一种创建交互式网页应用的网页开发技术:  WebSocket是HTML5一种新的协议,实现了浏览器与服务器全双工通信.其本质是先通过HT ...

  9. Linux查看端口号是否使用

    netstat -lntup|grep 80 如果令命无法执行 yum install net-tools

  10. if(){}使用

    1.当作 if else时使用 是判断if()括号内的内容和给定内容是不是相同 package cn.lyun.thread; class Demo{ boolean flag = false; pu ...