1. 程式人生 > >HDOJ 1370 中國剩余定理

HDOJ 1370 中國剩余定理

nbsp pid lan syn chinese cout sync days next

鏈接:

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 }

HDOJ 1370 中國剩余定理