POJ 1006 ( 中国剩余定理 )
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 112904 | Accepted: 35320 |
Description
Input
Output
Sample Input
0 0 0 0 0 0 0 100 5 20 34 325 4 5 6 7 283 102 23 320 203 301 203 40 -1 -1 -1 -1
Sample Output
Case 1: the next triple peak occurs in 21252 days. Case 2: the next triple peak occurs in 21152 days. Case 3: the next triple peak occurs in 19575 days. Case 4: the next triple peak occurs in 16994 days. Case 5: the next triple peak occurs in 8910 days. Case 6: the next triple peak occurs in 10789 days.
代码如下:
#include<stdio.h> #include<math.h> #define LL long long LL MM[10], NN[10], m[10]={23, 28, 33}, x, y; int extend_gcd(LL a, LL b, LL &x, LL &y) { if(b==0) { x=1; y=0; return a;} LL d = extend_gcd(b, a%b, x, y); LL t = x; x = y; y = t-a/b*y; return d; } int main() { int p, e, i ,d, j, k=0; LL M, X, dd; while(~scanf("%d%d%d%d", &p, &e, &i, &d)) { if(p==-1 && e==-1 && i==-1 && d==-1) break; M = m[0]*m[1]*m[2]; for(j=0; j<3; j++) MM[j] = M/m[j]; for(j=0; j<3; j++) { dd = extend_gcd(MM[j], m[j], x, y); x = x*(1/dd); x = (x%m[j]+m[j])%m[j]; NN[j] = x; } X = (MM[0]*NN[0]*p + MM[1]*NN[1]*e + MM[2]*NN[2]*i)% M; if(X==21252 && d==21252) printf("Case %d: the next triple peak occurs in 21252 days.\n", ++k); else if(X==0 && d!=21252) printf("Case %d: the next triple peak occurs in %d days.\n", ++k, 21252-d); else printf("Case %d: the next triple peak occurs in %lld days.\n", ++k, (X+21252-d)%21252); } return 0; }
此题注意判断当X==0 的情况, else if(X==0 && d!=21252) 直接输出 21252-d 即可。
而当X==21252 && d==21252时,直接输出 21252 即可。
其他情况直接输出 (X+21252-d)%21252 这里是为保证为正数。
中国剩余定理:
————————————————————————————————————————————————————————————————————————————
形式描述
用现代数学的语言来说明的话,中国剩余定理给出了以下的一元线性同余方程组:
有解的判定条件,并用构造法给出了在有解情况下解的具体形式。
中国剩余定理说明:假设整数m1, m2, ... , mn两两互质,则对任意的整数:a1, a2, ... , an,方程组有解,并且通解可以用如下方式构造得到:
- 设是整数m1, m2, ... , mn的乘积,并设是除了mi以外的n - 1个整数的乘积。
- 设为模的数论倒数:
- 方程组的通解形式为: 在模的意义下,方程组只有一个解:
————————————————————————————————————————————————————————————————————————————
此题中的变量对应公式中: a1 = p, m1 = 23; Mi ~~MM[ j ]; ti ~~NN[ j ];
a2 = e, m2 = 28;
a3 = i, m3 = 33;
此题运用中国剩余定理,然后在求 ti 的时候运用拓展欧几里得即可。