zoj 1160 && 中国剩余定理

#include<stdio.h>
int main()
{
	int a, b, c, d, e[3]={23*28, 23*33, 33*28}, f;
	int i=1 , n, j;

	scanf("%d", &n);
	while(n)
	{
               j=0;

	while (scanf("%d%d%d%d",&a, &b, &c, &d) && a!=-1 && b!=-1 && c != -1 && d !=-1 )
	{
		a = a>23 ? a%23 : a;
        b = b>28 ? b%28 : b;  
        c = c>33 ? c%33 : c;		


     	while(e[0] % 33 != 1 )
		{
			e[0] = (23 * 28) * i;
            i +=1;
		}
        while((e[1]) % 28 != 1 )
		{
			e[1] = (23 * 33) * i;
			i +=1;
		}
    	while(e[2] % 23 != 1 )
		{
			e[2] = (33 * 28) * i;
			i +=1;
		}


		f = (c*e[0] + b*e[1] + a*e[2]) - d ;
		j+=1;
		        
		printf("Case %d: the next triple peak occurs in %d days.\n",j, f>0? f%(23*33*28) : (23*28*33-d));
	} 
	n = n-1;
	if(n!=0) printf("\n");


	}
    return 0;
}
附:题目链接  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=160 点击打开链接

此题是中国剩余定理的应用,按照本人一贯的“拿来主义”,中国剩余定理可以理解为这样:a mod c1 = r1; a mod c2 = r2; a mod c3 =r3;  (c1*c2)*n1  mod  c3 == 1;               (c2*c3)*n2   mod  c1 == 1; (c1*c2)*n3  mod  c3 == 1;  那么   ( (c1*c2)*n1*r3  + (c2*c3)*n2*r1 + (c1*c3)*n3*r2 )  % HCF( c1, c2 ,c3) 即为满足条件的最小值(ps:HCF为最小公倍数)。


最后提交的数后PE了,原因是最后一个换行符被打印出来了,加个条件限制一下就可以了。


自己在oj上第一次通过数论题,good,不过数论知识还是很弱,以后得好好向人请教。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值