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