1. 程式人生 > >Biorhythms POJ - 1006 (中國剩餘定理)

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;
}