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

POJ 1006 生理周期【数论】

时间:2014-10-05 14:54:18      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:io   os   sp   c   amp   r   时间   ef   bs   

这题是有中文版的(右上角选项卡里把default改成简体中文)然后看到他把biorhythms翻成生理周期我可耻的笑了......23333

如果没有限定从日期d开始,完全可以从第一天起开始计时,因此设从第一天开始x天生理周期重合,很容易列出等式:

x=p+k1*23=e+k2*28= i+k3*33

接着转成同余式(方程组)

x ≡ p (mod 23)

x ≡ e (mod 28)

x ≡ i (mod 33)

 

哈 23 28 33 正好是互质的免去了另外的转换了,这时想直接套用中国剩余的模板显然是很蠢的做法,因为此时模数 23 28 33 都已给出很容易直接算出Mi,Mi’ :

M1=28*33=924

M1’*924≡1 (mod 23)

解得M1’=6

同理M2=23*33=759 M2’=19

M3=23*28=644 M3’=2

 

因此x=ΣMi*Mi’*ki(k1=p,k2=e,k3=i)=924*6*p+759*19*e+644*2*i

= 5544*p+14421*e+1288*i

因为要求0~23*28*33范围内的一组解并且有一个初始时间d 因此最终结果就是(5544*p+14421*e+1288*i-d)% 21252 再判断下防止结果为负数就行了

#include<cstdio>

#include<iostream>

#include<string.h>

using namespace std;

int main()

{

   int p,e,i,d,t=0,ans;

   scanf("%d%d%d%d",&p,&e,&i,&d);

   while (p!=-1)

    {

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

       if (ans<=0)ans+=21252;

       printf("Case %d: the next triple peak occurs in %ddays.\n",++t,ans);

       scanf("%d%d%d%d",&p,&e,&i,&d);

    }

   return 0;

}

POJ 1006 生理周期【数论】

标签:io   os   sp   c   amp   r   时间   ef   bs   

原文地址:http://www.cnblogs.com/philippica/p/4006956.html

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