poj 1006 Biorhythms

//题意:比如输入5,20,34,求一个数 M 满足
// M = 5 + 23 * P1 = 20 + 28 * P2 = 34 + 33 * P3; (P1,P2,P3,都为整数)
//即是 M≡5(mod 23)≡20(mod 28)≡34(mod 33) ,其中 23 , 28, 33 两两互素, 求线性同余方程组,解得M=19900

#include<iostream> //线性同余方程组
using namespace std;

int x,y,q;
void extend_eluid(int a,int b) //扩展欧几里德算法
{

if(b==0)
{
x=1;y=0;q=a;
}
else
{
extend_eluid(b,a%b);
int temp=x;
x=y;y=temp-a/b*y;
}
}


int main()
{
int A1,A2,A3,T,p,e,i,d,peak,cases=0;
extend_eluid(28*33,23);
A1=28*33*x;
extend_eluid(23*33,28);
A2=23*33*x;
extend_eluid(23*28,33);
A3=23*28*x;
T=23*28*33;
while(cin>>p>>e>>i>>d&&p!=-1)
{
peak=A1*p+A2*e+A3*i-d;
peak=(peak%T+T)%T; //最小非负整数
if(peak==0)

peak=T;
printf("Case %d: the next triple peak occurs in %d days.\n", ++cases,peak);
}
return 0;
}


/*
孙子定理: 求解线性同余方程组

x ≡ b1 mod m1
x ≡ b2 mod m2
: : : : : :
x ≡ bk mod mk
其中 m1,m2,...,mk 两两互素
令 M = m1*m2*...*mk , M1 = M / m1 , M2 = M / m2 ,... Mk = M / mk ,
M1'* M1 ≡1 mod m1, M2'* M2 ≡1 mod m2, ...,Mk'* Mk ≡1 mod mk
方程组的解为 x ≡ M1'* M1 * b1 + M2'* M2 * b2 + … + Mk'* Mk * bk (mod M)

*/

posted on 2011-07-17 23:33  sysu_mjc  阅读(161)  评论(0编辑  收藏  举报

导航