poj 1006 中国剩余定理

http://poj.org/problem?id=1006

此题用到了中国剩余定理。

若某数x分别被d1、d2、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:
x=R1*r1+R2*r2+…+Rn*rn+R*D
其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;
R2…、Rn同理

D是d1、d2、…、的最小公倍数;
R是任意整数,可根据实际需要决定;
且d1、、…dn、必须互质,以保证每个Ri(i=1,2,…,n)都能求得.

代码如下:

#include <stdio.h>
int main()
{
    int p,e,i,d,days,r1,r2,r3,ca = 1;
    for(i = 1,r1 = 28*33;;i ++)
    if(r1*i % 23 == 1)
    break;
    r1 *= i;
    for(i = 1,r2 = 23*33;;i ++)
    if(r2*i % 28 == 1)
    break;
    r2 *= i;
    for(i = 1,r3 = 28*23;;i ++)
    if(r3*i % 33 == 1)
    break;
    r3 *= i;
    while(scanf("%d %d %d %d",&p,&e,&i,&d) == 4)
    {
        if(p ==-1 && e == -1 && i == -1 && d == -1)
        break;
        days = (r1*p + r2*e + r3*i - d + 21252)%21252;
        if(days == 0)
        days = 21252;
        printf("Case %d: the next triple peak occurs in %d days.\n",ca++,days);
    }
    return 0;
}
posted @ 2011-07-21 10:46  zhangteng  阅读(175)  评论(0编辑  收藏  举报