POJ 1006

典型的中国余数定理的应用。
设m1,m2,..,mk是k个两两互素的正整数,m=m1*m2*...*mk,Mi=m/mi(i=1,2,..,k)。则同余方程组
x≡b1(mod m1)
x≡b2(mod m2)
......
x≡bk(mod mk)
有唯一解。
x≡M'1M1b1+…+M'kMkbk (modm),其中M'iMi≡1 (modmi),i=1,2,…,k 
举个最经典的例子,今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?
除数序列{3,5,7};对应的余数序列{2,3,2}
接下来我们需要求一个数k1满足k1 %3==1&&k1%5==k1%7==0。
因为k1%5==k1%7==0,所以又k1=35的倍数,得k最小应该为70。
类推得k2=21,k3=15,
此时70a+21b+15c就是mod 3余a,mod 5余b,mod 7余c的数了。
为什么一直要求除数序列要互素?原因是如果不互素的话那么肯定无法求出全部的满足如上定理的k,结论自然也无法求得。
解题的关键就是求ki。
#include <stdio.h>
int main()
{ 
    int p,e,i,d,a,t=0;
    while(1)
    {
        scanf("%d%d%d%d",&p,&e,&i,&d);
        if(p==-1 && e==-1 && i==-1 && d==-1)
            break;
        a=(5544*p+14421*e+1288*i-d+21252)%21252;
        if(!a)//a==0
            a=21252;
        printf("Case %d: the next triple peak occurs in %d days.\n",++t,a);
    }
    return 0;
}
posted @ 2011-05-10 14:20  Ac_smile  阅读(151)  评论(0编辑  收藏  举报