您的位置:首页 > 其它

POJ 1006 Biorhythms (中国剩余定理)

2017-08-10 16:48 441 查看
题目链接:点击打开链接题目大意:人的一生有三种周期:体力,感情,智力,分别为: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=6e*23*33*b%28==1的最小的正整数(b为正整数),即b=19i*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
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息