POJ 1006 Biorhythms(中国剩余定理)

题目链接

题目大意

  人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。

解题思路

  这是一道关于中国剩余定理的裸题。我们对问题稍微变形,就可以把它转换成让你求一个日期k,k模23得p,模28得e,模33得i,问这个数与日期d的差值(这个数必须大于d)。也就转换成了经典的中国剩余定理问题。

代码

int a, b, c, d, x, y, kase = 1;
int exgcd(int a, int b) {
    if (!b) {
        x = 1, y = 0;
        return x;
    }
    exgcd(b, a%b);
    ll t = x; x = y;
    y = t - a/b*y;
    return (x%b+b)%b;
}
int inv1 = exgcd(28*33, 23);
int inv2 = exgcd(23*33, 28);
int inv3 = exgcd(23*28, 33);
int crt() {
    int sum = a*28*33*inv1 + b*23*33*inv2 + c*23*28*inv3 - d;
    sum = (sum+21252)%21252;
    if (!sum) sum += 21252;
    return sum;
}
int main(){
    while(~scanf("%d%d%d%d", &a, &b, &c, &d) && (~a&&~b&&~c&&~d)) {
        a %= 23; b %= 28; c %= 33;
        printf("Case %d: the next triple peak occurs in %d days.\n", kase++, crt());
    }
    return 0;
}
posted @ 2020-05-11 11:19  shuitiangong  阅读(143)  评论(0编辑  收藏  举报