poj.1006

来源:互联网 发布:淘宝全球购入口官网 编辑:程序博客网 时间:2024/06/04 22:47

Source Code

Problem: 1006 User: mengerMemory: 164K Time: 63MSLanguage: C++ Result: Accepted
  • 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。

    中国剩余定理,本题难点不在编程,而是分析题目并转化为数学公式

    要引入本题解法,先来看一个故事韩信点兵
    传说西汉大将韩信,由于比较年轻,开始他的部下对他不很佩服。有一次阅兵时,韩信要求士兵分三路纵队,结果末尾多2人,改成五路纵队,结果末尾多3人,再改成七路纵队,结果又余下2人,后来下级军官向他报告共有士兵2395人,韩信立即笑笑说不对(因2395除以3余数是1,不是2),由于已经知道士兵总人数在2300~2400之间,所以韩信根据23128233------,每相邻两数的间隔是105357的最小公倍数),便立即说出实际人数应是2333人(因2333=128+20χ105+105,它除以32,除以53,除以72)。这样使下级军官十分敬佩,这就是韩信点兵的故事。

    韩信点兵问题简化:已知 n%3=2, n%5=3, n%7=2,n


    再看我们这道题,读入p,e,i,d 4个整数

    已知(n+d)%23=p; (n+d)%28=e; (n+d)%33=i ,n

    两道题是一样的。但是韩信当时计算出结果的?
    韩信用的就是中国剩余定理,《孙子算经》中早有计算方法,大家可以查阅相关资料。
    韩信点兵问题计算如下:

    因为n%3=2, n%5=3, n%7=2 357互质(互质可以直接得到这三个数的最小公倍数)

    x= n%3=2 y= n%5=3 z= n%7=2
    使5×7×a3除余1,有35×2=70,即a=2
    使3×7×b5除余1,用21×1=21,即b=1
    使3×5×c7除余1,用15×1=15,即c=1
    那么n =70×x+21×y+15×z%lcm(3,5,7) = 23这是n的最小解

    而韩信已知士兵人数在2300~2400之间,所以只需要n+i×lcm(3,5,7)就得到了2333,此时i=22

    同样,这道题的解法就是:

    已知(n+d)%23=p; (n+d)%28=e; (n+d)%33=i
    使33×28×a23除余1,用33×28×8=5544
    使23×33×b28除余1,用23×33×19=14421
    使23×28×c33除余1,用23×28×2=1288
    因此有(5544×p+14421×e+1288×i% lcm(23,28,33) =n+d

    232833互质,即lcm(23,28,33)= 21252;
    所以有n=5544×p+14421×e+1288×i-d%21252

    本题所求的是最小整数解,避免n为负,因此最后结果为n= [n+21252]% 21252
    那么最终求解n的表达式就是:

    n=(5544*p+14421*e+1288*i-d+21252)%21252;

    当问题被转化为一条数学式子时,你会发现它无比简单。。。。直接输出结果了。

     

    Source Code
    #include<iostream>using namespace std;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=21252;printf("Case %d: the next triple peak occurs in %d days.\n",++t,a);}return 0;}
0 0
原创粉丝点击