题目链接:点击打开链接
题目大意:人的一生有三种周期:体力,感情,智力,分别为:23、18、33。每个周期里都有巅峰的一天,处于巅峰时期时状态达到最佳。三个周期不同,但可能在同一天达到巅峰。前三个输入p、e和i的值是指从年初开始的,物理、情感和智力的周期分别达到峰值的天数。,最后一个输入是给定的日期(该年的第几天),求:下一次同时达到巅峰到d的天数。
先了解中国剩余定理:(以下资料都是整合的别人的代码,方便大家理解)
《孙子定理》中的问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
(求一个数,除以三余2,处于5余3,除以7余2)
关系到两个基本定理:
定理1:几个数相加,如果存在一个加数,不能被数a整除,那么它们的和,就不能被整数a整除。
定理2:两数不能整除,若除数扩大(或缩小)了几倍,而被除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)
具体解法分四步:
1.找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。
2.(运用的定理2)用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数)
3.(运用的定理1)然后把三个乘积相加(15*2+21*3+70*2)得到和233。R1=15*2, R2=21*3,R3=70*2.
4.用233除以3,5,7三个数的最小公倍数105,得到余数23,即233%105=23。这个余数23就是符合条件的最小数。
解题思路:
由以上方法求出一个最小的数数,mod 23=p,mod 28=e,mod 33=i。
p*28*33*a%23==1的最小的正整数(a为正整数),即a=6
e*23*33*b%28==1的最小的正整数(b为正整数),即b=19
i*23*28*c%33==1的最小的正整数(c为正整数),即c=2
代码如下:
#include<iostream> #include<cstdio> using namespace std; int main() { int p,e,i,d; int t=1; int a; cin>>a; while(cin>>p>>e>>i>>d) { if(p==-1&&e==-1&&i==-1&&d==-1) break; int ans=0; ans=(p*28*33*6+23*33*19*e+28*23*2*i)%(28*23*33); if(ans-d<=0) ans+=(28*23*33); printf("Case %d: the next triple peak occurs in %d days.\n",t++,ans-d); } return 0; }
~step by step