HDOJ 1370 中国剩余定理

链接:

http://acm.split.hdu.edu.cn/showproblem.php?pid=1370

题意:

有3个循环周期,周期天数分别为23、28、33。对于某一年,已知某年这3个周期的某一峰值分别是当年的第p、e、i天,

问从第d天开始到最近一个满足3个周期都达到峰值的日期还有多少天。

题解:

直接套中国剩余定理就行了

代码:

31 int extgcd(int a, int b, int &x, int &y) {
32     int d = a;
33     if (b) d = extgcd(b, a%b, y, x), y -= (a / b) * x;
34     else  x = 1, y = 0;
35     return d;
36 }
37 
38 int Chinese_Remainder(int a[], int w[], int len) //中国剩余定理 a[]存放余数  w[]存放两两互质的数  
39 {
40     int i, d, x, y, m, n, ret;
41     ret = 0;
42     n = 1;
43     for (i = 0; i<len; i++) n *= w[i];
44     for (i = 0; i<len; i++){
45         m = n / w[i];
46         d = extgcd(w[i], m, x, y);
47         ret = (ret + y*m*a[i]) % n;
48     }
49     return (n + ret%n) % n;
50 }
51 
52 int main() {
53     ios::sync_with_stdio(false), cin.tie(0);
54     int w[15] = { 23,28,33 }, a[15];
55     int cas;
56     cin >> cas;
57     int d;
58     while (cin >> a[0] >> a[1] >> a[2] >> d) {
59         if (a[0] == -1) break;
60         a[0] %= 23;
61         a[1] %= 28;
62         a[2] %= 33;
63         int ans = Chinese_Remainder(a, w, 3);
64         ans -= d;
65         if (ans <= 0) ans += 23 * 28 * 33;
66         cout << "Case " << cas++ << ": the next triple peak occurs in " << ans << " days." << endl;
67     }
68     return 0;
69 }
原文地址:https://www.cnblogs.com/baocong/p/7620507.html