hdu 1370(中国剩余定理)

点击打开链接


题意:

人有三个循环,循环周期分别为23,28,33,给你这三个周期出现的时间a,b,c,以及开始计算的天数d。求三个周期在同一天的时间。。。


a=(n-d)%23;

b=(n-d)%28

c=(n-d)%33;

23  28   33互质可以用中国剩余定理

ps:自己犯了一个小错误,debug好长时间。。


#include"stdio.h"
#include"string.h"
#define N 4

int A[N],R[N],k;
void exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1;y=0;
	}
	else
	{
		exgcd(b,a%b,x,y);
		int t=x;
		x=y;
		y=t-(a/b)*y;
	}

}
int china_reminder(int a[],int r[],int k)
{
	int i;
	int x,y;
	int n,m;
	int ans;
	ans=0;n=1;
	for(i=0;i<k;i++)
		n*=a[i];
	for(i=0;i<k;i++)
	{
		m=n/a[i];
		exgcd(m,a[i],x,y);
		ans=(ans+m*x*r[i]+n)%n;//不要写成ans+=..
	}
	if(ans<=0)ans+=n;
	return ans;
}
int main()
{
	int ans;
	int d;
	int t=1;
	int a,b,c;
	scanf("%d",&a);
	while(scanf("%d%d%d%d",&a,&b,&c,&d)!=-1)
	{
		if(a==-1&&b==-1&&c==-1&&d==-1)break;
		k=3;
		a%=23;b%=28;c%=33;
		A[0]=23;R[0]=a;
		A[1]=28;R[1]=b;
		A[2]=33;R[2]=c;
		ans=china_reminder(A,R,k);
		ans-=d;
		if(ans<=0)ans+=23*28*33;
		printf("Case %d: the next triple peak occurs in %d days.\n",t++,ans);
	}
	return 0;
}


你可能感兴趣的:(数学,HDU,中国剩余定理)