码迷,mamicode.com
首页 > 其他好文 > 详细

【中国剩余定理】 poj 1006

时间:2014-10-10 12:02:54      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   for   数据   sp   div   on   

生理周期  简单模拟

对于超出23 * 28 * 33(21252)时进行求余运算即可。

 

#include<stdio.h>
int main()
{
    //freopen("in.txt","r",stdin);
    int a,b,c,d,s,m=1;
    while(scanf("%d %d %d %d",&a,&b,&c,&d),(a!=-1||b!=-1||c!=-1||d!=-1))
    {
        s=a;
        if(b>s)
            s=b;
        if(c>s)
            s=c;
        do
        {
            s++;
      }while (((s+d-a)%23!=0)|| ((s+d-b))%28!=0 ||((s+d-c)%33!=0) );
        if(s>21252)
           s=s%21252;
        printf("Case %d: the next triple peak occurs in %d days.\n",m,s);
        m++;
    }
    return 0;
}

 

 

 

中国剩余定理
若某数x分别被d1、、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:
x=R1r1+R2r2+…+Rnrn+RD
其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;
R1 、R2…、

Rn是d1、d2、…、dn-1的公倍数,而且被dn除,余数为1;
D是d1、d2、…、的最小公倍数;
R是任意整数,可根据实际需要决定;
且d1、、…、必须互质,以保证每个Ri(i=1,2,…,n)都能求得.
实际上POJ1006就是中国剩余定理的典型应用
根据上面的条件求出常数R1 = 5544,R2 = 14421,R3 = 1288,D = 21252
每次给的数据中的前三个值即相当于上面的余数。
则显然:
res = R1 * Physical + R2 * Emotion + R3 * Intelligence + RD - givenDate
并且0 =< res <= D

#include <stdio.h>
int main()
{
    int R1 = 5544, R2 = 14421, R3 = 1288, R = 21252;
    int ph, em, in, day;
    int res,i;
    for(i=1; 1; i++){
       scanf("%d%d%d%d", &ph, &em, &in, &day);
       if(ph==-1)break;
       res = (R1 * ph + R2 * em + R3 * in - day) % R;
 
       res = (res + R - 1) % R + 1;  //此步处理了负数和零的两种边界情况
       printf("Case %d: the next triple peak occurs in %d days.\n", i, res);
    }
    return 0;
}

 

提交结果:

模拟          782MS

中国剩余定理  32MS

太高端了!!!!!!

 

【中国剩余定理】 poj 1006

标签:style   blog   color   io   for   数据   sp   div   on   

原文地址:http://www.cnblogs.com/balfish/p/4015165.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!