POJ_1006

http://poj.org/problem?id=1006

根据题意很自然地写出了暴破解法如下:

//POJ_1006
#include<stdio.h>
int main(){
    int n,i,j,k;
    int p,q,r,d;
    n = 0;
    while(true){
        scanf("%d %d %d %d",&p,&q,&r,&d);
        if(p==-1 && q==-1 && r==-1 && d==-1){
            break;
        }
        n++;
        for(i=p;;i+=23){
            for(j=q;j<=i;j+=28){
                for(k=r;k<=j;k+=33){
                    if(k==j&&j==i){
                        goto l1;
                    }
                }
            }
        }
l1:        if(d>=i){
            i+=21252; 
        }
        printf("Case %d: the next triple peak occurs in %d days.\n",n,i-d);
    }
    return 0;
}

但是太慢了,TLE

网上搜了下,根据中国剩余定理可以使效率得到很好的提升

https://blog.csdn.net/blogdevteam/article/details/102485483

//POJ_1006
//https://blog.csdn.net/qq_40379678/article/details/79034011
//中国剩余定理
/*
    a%b=c ==> (a+kb)%b=c
       a%b=c ==> (a*k)%b=kc 
*/
/*
    S = p+23a = q+28b = r+33c
    23*28 = 644
    23*33 = 759
    28*33 = 924
    23*28*33 = 21252
*/
#include<stdio.h>
int main(){
    int n,i,j,k;
    int p,q,r,d;
    int p1,q1,r1;
    int S;
    n = 0;
    while(true){
        scanf("%d %d %d %d",&p,&q,&r,&d);
        if(p==-1 && q==-1 && r==-1 && d==-1){
            break;
        }
        n++;
        p1 = p%23;
        for(i=924;;i+=924){
            if(i%23==1){
                break;
            }
        }
        i = i*p1;
        q1 = q%28;
        for(j=759;;j+=759){
            if(j%28==1){
                break;
            }
        }
        j = j*q1;
        r1 = r%33;
        for(k=644;;k+=644){
            if(k%33==1){
                break;
            }
        }
        k = k*r1;
        S = (i+j+k)%21252;
        if(S<=d){
            S = S+21252;
        }
        printf("Case %d: the next triple peak occurs in %d days.\n",n,S-d);
    }
    return 0;
}

————————————————

版权声明:本文为CSDN博主「abc827300139」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ABC827300139/article/details/102490609

猜你喜欢

转载自www.cnblogs.com/stevenzrx/p/11657227.html