POJ 1006 Biorhythms (中国剩余定理)

题目链接:点击打开链接


题目大意:人的一生有三种周期:体力,感情,智力,分别为: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

发布了37 篇原创文章 · 获赞 23 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zsheng_/article/details/77061882