POJ1006 Biorhythms【中国剩余定理】

<题目链接>

题目大意:

人体的体力每23天会达到峰值,情感每28天会达到峰值,智力每33天会达到峰值,一个人在a天体力达到峰值,b天情感达到峰值,c天智力达到峰值,求这个人下一次体力情感智力均达到峰值的天数减去d。

#include <iostream>
using namespace std;
int Extended_Euclid(int a,int b,int &x,int &y) 
{
    int d;
    if(b==0)
    {
        x=1;y=0;
        return a;
    }
    d=Extended_Euclid(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int Chinese_Remainder(int a[],int w[],int num) 
{
    int i,d,x,y,m,lcm,ret;
    ret=0;
    lcm=1;
    for (i=0;i<num;i++)
        lcm*=w[i];
    for (i=0;i<num;i++)
    {
        m=lcm/w[i];
        d=Extended_Euclid(w[i],m,x,y);
        ret=(ret+y*m*a[i])%lcm;
    } 
    return (lcm+ret%lcm)%lcm;   
}

int main()
{
    int n,i,c,d,C=1,ans;
    int w[15]={23,28,33},a[15];
    while (scanf("%d %d %d %d",&a[0],&a[1],&a[2],&d)!=EOF)
    {
        if(a[1]==-1&&a[2]==-1&&a[0]==-1) break;
        a[0]%=23;
        a[1]%=28;
        a[2]%=33;
        int lcm=33*28*23;   
        ans=Chinese_Remainder(a,w,3);    
        ans=ans-d;
        if(ans<=0) ans=ans+lcm;     
        printf("Case %d: the next triple peak occurs in %d days.\n", C++,ans);
    } return 0;
}

2018-07-31

猜你喜欢

转载自www.cnblogs.com/00isok/p/9398887.html