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 }