Biorhythms(中国剩余定理)
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 127339 | Accepted: 40342 |
Description
Input
Output
Case 1: the next triple peak occurs in 1234 days.
Use the plural form ``days'' even if the answer is 1.
Sample Input
0 0 0 0
0 0 0 100
5 20 34 325
4 5 6 7
283 102 23 320
203 301 203 40
-1 -1 -1 -1
Sample Output
Case 1: the next triple peak occurs in 21252 days.
Case 2: the next triple peak occurs in 21152 days.
Case 3: the next triple peak occurs in 19575 days.
Case 4: the next triple peak occurs in 16994 days.
Case 5: the next triple peak occurs in 8910 days.
Case 6: the next triple peak occurs in 10789 days.
题解:
Description
Input
当p = e = i = d = -1时,输入数据结束。
Output
采用以下格式: Case 1: the next triple peak occurs in 1234 days.
注意:即使结果是1天,也使用复数形式“days”。
现设 num 是下一个相同日子距离开始的天数
p,e,i,d 如题中所设!
那么就可以得到三个式子:( num + d ) % 23 == p; ( num + d ) % 28 == e; ( num + d ) % 33 == i;
p,e,i,d 是我们输入的,那么我们需要求出num即可,为了方便,我们将num+d暂时作为一个整体!令x = num + d;
即:x % 23 == p; x % 28 == e; x % 33 == i;求x
怎么办?这就涉及到所谓的 “ 中国剩余定理 ”( 概念自己google,很easy )
《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“23”。
--------这个就是传说中的“中国剩余定理”。 其实题目的意思就是,n % 3 = 2, n % 5 = 3, n % 7 = 2; 问n是多少?
那么他是怎么解决的呢?
看下面:
题目中涉及 3, 5,7三个互质的数、
令:5 * 7 * a % 3 = 1; --------------> a = 2; 即5 * 7 * 2 = 70;
3 * 7 * b % 5 = 1; --------------> b = 1; 即3 * 7 * 1 = 21;
3 * 5 * c % 7 = 1; --------------> c = 1; 即3 * 5 * 1 = 15;
为什么要使余数为1:是为了要求余数2的话,只要乘以2就可以,要求余数为3的话,只要乘以3就可以!
( 因为题目想要n % 3 =2, n % 5 =3, n % 7 =2; )
那么:要使得n % 3 = 2,那么( 5 * 7 * 2 )*2 % 3 = 2;( 因为5 * 7 * 2 % 3 = 1 )
同理: 要使得n % 5 = 3,那么( 3 * 7 * 1 )*3 % 5 = 3;( 因为3 * 7 * 1 % 5 = 1 )
同理:要使得n % 7 = 2,那么( 3 * 5 * 1 )* 2 % 7 = 2;( 因为3 * 5 * 1 % 7 = 1 )
那么现在将( 5 * 7 * 2 )* 2和( 3 * 7 * 1 )* 3和( 3 * 5 * 1 )* 2相加会怎么样呢?我们知道
( 5 * 7 * 2 )* 2可以被5和7整除,但是%3等于2
( 3 * 7 * 1 )* 3可以被3和7整除,但是%5等于3
( 3 * 5 * 1 )* 2可以被3和5整除,但是%7等于2
那么即使相加后,%3, 5, 7的情况也还是一样的!
那么就得到一个我们暂时需要的数( 5 * 7 * 2 )* 2 +( 3 * 7 * 1 )* 3 +( 3 * 5 * 1 )* 2 = 233
但不是最小的!所有我们还要 233 % ( 3 * 5 * 7 ) == 23 得解!
/******************************************************************************************************************************************************/
// 以上就是算法解析,貌似讲的不是很清晰,哎,大家见谅咯~
现在看看此题:x % 23 == p; x % 28 == e; x % 33 == i;求x
按照以上算法:
使 33 * 28 * a % 23 = 1,得a = 6; 33 * 28 * 6 = 5544;
使23 * 33 * b % 28 = 1, 得b = 19;23 * 33 * 19 = 14421;
使23 * 28 * c % 33 = 1, 得c = 2; 23 * 28 * 2 = 1288。
那么x = 5544 * p + 14421 * e + 1288 * i
那么x-d即相差的时间天数!
因为有范围限制,那么(x-d) %= 21252;且如果此时<=0,那么(x-d) += 21252 ,以上都只是为了保证在范围内而已~
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
bool js(int a, int b, int c, int d){
if(a == b && b == c && c == d && a == -)
return false;
return true;
}
int main(){
int p, e, i, d, kase = ;
while(~scanf("%d%d%d%d", &p, &e, &i, &d), js(p, e, i, d)){
int a, b, c;
for(a = ; ; a++){
if(**a % == ){
a = **a;
break;
}
}
for(b = ; ; b++){
if(**b % == ){
b = **b;
break;
}
}
for(c = ; ; c++){
if(**c % == ){
c = **c;
break;
}
}
// printf("%d %d %d\n", a, b, c);
int sum = a*p + b*e + c*i;
int x = (sum - d) % ;
if(x <= )x += ;
printf("Case %d: the next triple peak occurs in %d days.\n", ++kase, x);
}
return ;
}
Biorhythms(中国剩余定理)的更多相关文章
- Biorhythms(中国剩余定理)
http://shuxueshi.jie.blog.163.com/blog/static/13611628820104179856631/ 这篇博客写的很棒! #include<stdio.h ...
- POJ 1006 - Biorhythms (中国剩余定理)
B - Biorhythms Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Subm ...
- POJ 1006 Biorhythms --中国剩余定理(互质的)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 103539 Accepted: 32012 Des ...
- POJ 1006 Biorhythms(中国剩余定理)
题目地址:POJ 1006 学习了下中国剩余定理.參考的该博客.博客戳这里. 中国剩余定理的求解方法: 假如说x%c1=m1,x%c2=m2,x%c3=m3.那么能够设三个数R1,R2,R3.R1为c ...
- PKU POJ 1006 Biorhythms (中国剩余定理)
中国剩余定理 x = ai (mod mi) ai和mi是一组数,mi两两互质,求x 令Mi = m1*m2*~mk 其中,mi不包含在内. 因为mi两两互质,所以存在x和y, st M ...
- poj1006 / hdu1370 Biorhythms (中国剩余定理)
Biorhythms 题意:读入p,e,i,d 4个整数,已知(n+d)%23=p; (n+d)%28=e; (n+d)%33=i ,求n . (题在文末) 知识点:中国剩余定理 ...
- POJ1006——Biorhythms(中国剩余定理)
Biorhythms Description人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色. ...
- poj 1006:Biorhythms(水题,经典题,中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 110991 Accepted: 34541 Des ...
- Biorhythms(poj1006+中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117973 Accepted: 37026 Des ...
随机推荐
- 利用dedecms给近三天(或当天)发布的文章显示红色日期或加上new字或new小图片
1)红色日期 <br>[field:pubdate runphp='yes'] <br>$a="<font color=red>".strfti ...
- 未能载入文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件。
这个一般出如今三层给B层与D层之间加抽象工厂-接口-映射.时候出的错.出错的地方是抽象工厂. --如图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTA ...
- mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信
这个仅仅能作为自己初步了解MDA的开门篇 实现功能: 将字符串数据通过DMA0通道传递给UTXH0,然后在终端 显示.传输数据完后.DMA0产生中断,beep声, LED亮. DMA基本知识 计算机系 ...
- Java 编程下使用 Class.forName() 加载类
在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 Class 的静态 forName() 方法实现动态加载类.下面的范例让你可以指定类名称来获得类的相关信息. ...
- asp.net 实现 tts
之前用WinForm实现tts已经成功,就调用了下系统的类库.但我把相同的代码搬到asp.net上时却碰到了许多问题,查了好多网站.试过了很多方法,到现在算是做出了一部分吧. 之前调用微软的TTS是用 ...
- 《第一行代码》学习笔记8-活动Activity(6)
1.返回上一个活动只需要按一下Back键,还有一个startActivityForResult()方法也是 用于启动活动,这个方法期望在活动销毁时能够返回一个结果给上一个活动. 2.startActi ...
- Java数据库缓存思路
为什么要用缓存?如果问这个问题说明你还是新手,数据库吞吐量毕竟有限,每秒读写5000次了不起了,如果不用缓存,假设一个页面有100个数据库操作,50个用户并发数据库就歇菜,这样最多能支撑的pv也就50 ...
- javascript 生成UUID
代码一: /*! Math.uuid.js (v1.4) http://www.broofa.com mailto:robert@broofa.com Copyright (c) 2010 Rober ...
- ext4 grid edit 添加删除行
extjs--grid动态添加一行和删除一行: (1)选择rowEditing时,添加一行后的编辑方式为----startEdit(record,columnHeader) (2)选择cellEdit ...
- python yield 理解
在别人的代码中看到yield这个关键字,看了几篇资料,说一下个人理解. 包含yield 关键字的函数成为一个迭代器,yield跟return的位置一样,只不过每次返回结果后,并没有退出,而是等待下一次 ...