poj1006 / hdu1370 Biorhythms (中国剩余定理)

Biorhythms

题意:读入p,e,i,d 4个整数,已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i ,求n 。        (题在文末)

 

知识点:中国剩余定理。 /*解释*/

 

题解:已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i 
       33×28×a模23的逆元为8,  则33×28×8=5544; 
       23×33×b模28的逆元为19,则23×33×19=14421; 
       23×28×c模33的逆元为2,  则23×28×2=1288。 
      因此有(5544×p+14421×e+1288×i)% lcm(23,28,33) =n+d       (
lcm(23,28,33)= 21252)
     所以n=(5544×p+14421×e+1288×i-d)%21252

本题所求的是最小整数解,避免n为负,因此最后结果 n=(n+21252)% 21252

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

#include<iostream>  
using namespace std;  
   
int main()  
{  
    int p,e,i,d;  
    for(int kase=1;;kase++)
    { 
    <span style="white-space:pre">	</span>while(cin>>p>>e>>i>>d)  
   <span style="white-space:pre">	</span>{  
       <span style="white-space:pre">	</span>     if(p==-1 && e==-1 && i==-1 && d==-1)  
        <span style="white-space:pre">	</span>    break;  
            int lcm=21252;  
            int n=(5544*p+14421*e+1288*i-d+21252)%21252;  
            if(n==0)  
                n=21252;  
            cout<<"Case "<<kase<<": the next triple peak occurs in "<<n<<" days."<<endl;  
        }
    }  
    return 0;  
}  



其实上面是别人的解法:http://blog.csdn.net/lyy289065406/article/details/6648551

 

我的解法:

//我的另一种解法:没上面方法好,就不写题解了。。
//其实是忘了当时咋想的了,只记得没用中国剩余定理。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
int main()
{
    for(int kase=1;;kase++)
    {
        int p,e,i,d;
        cin>>p>>e>>i>>d;
        if(p==-1&&e==-1&&i==-1)
        {
            break;
        }
        int ii=i-i/33*33;
        int j;
        for(j=d+1;j<=21252*2;j++)
        {
            if((j-ii)%33==0)
                break;
        }
        for(;j<=21252*2;j+=33)
        {
            if((j-(e-e/28*28))%28==0&&(j-(p-p/23*23))%23==0)
            {
                printf("Case %d: the next triple peak occurs in %d days.\n",kase,j-d);
                break;
            }
        }
    }
}


你可能感兴趣的:(poj1006 / hdu1370 Biorhythms (中国剩余定理))