POJ 1006 Biorhythms

中国剩余定理什么的。。。(若干年前用暴力随手A过)

x=ai(mod mi) 求x 其中mi与mj互质

令M=prod/mi,Mi=M/mi,

由于gcd(Mi,mi)=1,而有p,q满足p*Mi+q*mi=gcd(Mi,mi),

故p*Mi+q*mi=1,

则p*Mi=1 (mod mi),ai*p*Mi=ai (mod mi)

令x=sum( ai*p*Mi ),则x=ai (mod mi),

因为aj*pj*Mj=0 (mod mi) 因为mi|Mj。

所以x满足所有x=ai(mod mi)。

 

这道题就是求x使得

(x-a1)%m1=0

(x-a2)%m2=0

(x-a3)%m3=0

 

化简就是

x-a1=m1*k

x=m1*k+a1

x=a1 (mod m1)

然后求就行了。。。

 

#include<stdio.h>
int m[5]={23,28,33};
int a[5];
int e_gcd(int a,int b,int &x,int &y){
	if(b==0){x=1,y=0;return a;}
	else{
		int r=e_gcd(b,a%b,y,x);
		y-=x*(a/b);
		return r;
	}
}
int crt(int a[],int m[],int n){
	 int i,x,y,tmp,M=1,as=0;
	 for(i=0;i<n;i++)M*=m[i];
	 for(i=0;i<n;i++){
		tmp=M/m[i];
		e_gcd(tmp,m[i],x,y);
		as=(as+tmp*a[i]*x)%M;
	 }
	return (as+M)%M;
}
int main(){
	int x,y,cs=1;
	while(~scanf("%d%d%d%d",&a[0],&a[1],&a[2],&y)){
		if(a[0]<0)break;
		x=crt(a,m,3);
		x=(x-y+21252)%21252;
		printf("Case %d: the next triple peak occurs in %d days.\n",cs++,x==0?21252:x);
	}
	return 0;
}


 

你可能感兴趣的:(POJ 1006 Biorhythms)