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.
中国剩余定理,又叫做孙子定理,是数论比較重要的定理:
给你正整数a1,a2,a3,b1,b2,b3,bi是ai相应的X取余,且Xmod ai = bi,中国剩余定理让求的就是X的值,求X(最小)的时候,运用中国剩余定理能够大大缩短时间;
先说明一个定理,这也是剩余定理的核心定理:
X1 mod a1 = b1;
X2 mod a2 = b2;
若X1 ,X2均为 最小值,那么X1+X2也是最小值,而且(X1+X2) =(这里是恒等,打不出来。。)bi (mod ai),能看出来,这是中国剩余定理的公式。这里不加证明,由于须要证明同余方程的线性运算的正确性。
因此,中国剩余定理的意义也就非常明显了:求每一对同余方程的值。
每个值的求法须要明白它的意义才干找出来;
对于每一个值,须要Xi mod aj (!=i)==0&&Xi mod ai = bi;
为什么要等于0呢,对于当前值,没有这个要求,可是对于最后的值,我们要求的是对每个子例子,满足线性同余方程,这里用反证法证明:
如果每个不满足仅仅对当前的值满足余数唯一,对其它值有余数,那么最后的值仍有这个性质,但最后的值仍然对这个其它的值有正确值,矛盾,如果不成立。
到这里,须要证明的所有完毕。
那么怎样求呢:
既然是最小的而且有约束条件,那么就从约束条件进行下手:
用到的老师刚讲的求模的一个线性运算(a * b )%c = (a%c*b%c)%c;
所以我们将Xi分解成k and n;
n = bi,so a%c = 1,and a%aj ==0 && a %c = 1;
and we should get a is the least ,we know the CRT is concernd by prime number which is ai,in other words,all the data is gcd(ai,aj) = 1,so make a circle to get k.
follow is code :
#include<cstdio> using namespace std; int main(void) { int p, e, i, d, icase = 1; while (scanf("%d%d%d%d", &p, &e, &i, &d), ~p) { int n = (5544 * p + 14421 * e + 1288 * i - d + 21252) % 21252; if (n == 0) n = 21252; printf("Case %d: the next triple peak occurs in %d days.\n",icase++,n); } return 0; }