Biorhythms POJ - 1006 (中国剩余定理)

传送门

题意:已知一个人的身体,智力和情感的循环周期,然后给出一个人身体,智力和情感的开始值,最后再给出一个固定时间,问在下一次三个共同达到峰值的时间在这个固定时间多长时间后。

题解:中国剩余定理板题,首先得了解拓展gcd,知道了这个后,再了解下求逆元传送门,在看下百科上的解释就懂了传送门,然后直接套拓展gcd的板子即可(尽量自己打)。

附上代码:

#include<iostream>
#include<cstdio>

using namespace std;

void ex_gcd(int a,int b,int &x,int &y)
{
    if(b==0){
        x=1;
        y=0;
    }else{
        int x1,y1;
        ex_gcd(b,a%b,x1,y1);
        x=y1;
        y=(x1-(a/b)*y1);
    }
    return ;
}

int main()
{
    int m[4];
    m[1]=23;m[2]=28;m[3]=33;
    int M=1;
    for(int i=1;i<=3;i++){
        M*=m[i];
    }
    int ans[4];
    for(int i=1;i<=3;i++){
        int x1,y1;
        int mi=M/m[i];
        ex_gcd(mi,m[i],x1,y1);
        while(x1<0){
            x1+=m[i];
        }
        ans[i]=mi*x1;
    }
    int a,b,c,d;
    int casen=0;
    while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
        if(a==-1&&b==-1&&c==-1&&d==-1){
            break;
        }
        casen++;
        int n=0;
        n=(ans[1]*a+ans[2]*b+ans[3]*c-d+M)%M;
        if(n==0){
            printf("Case %d: the next triple peak occurs in %d days.\n",casen,M);
        }else{
            printf("Case %d: the next triple peak occurs in %d days.\n",casen,n);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/84574196