题目的意思是,给定三个周期,23,28,33,然后给出这三个周期在一年内上次出现最高峰的日期,分别为:p,e,i。再给出一个当前日期d。

请计算从当前d开始往后,下次三个周期重合的时间距离现在是多少天。

注意,如果下次周期重合的时间小于等于d都是不可用的。


代码:乱搞版本

StatusAccepted
Time63ms
Memory644kB
Length557
LangG++
#include <iostream>
#include <cstdio>
using namespace std;
const int pi=23,ei=28,ii=33, days=21252;
int p, e, i, d, ans;
int main()
{
    int cas=1;
    while(~scanf("%d%d%d%d", &p,&e,&i,&d)&&p+e+i+d!=-4){
        if(p>=pi)p%=pi;
        if(e>=ei)e%=ei;
        if(i>=ii)i%=ii;
        ans=0;
        for(int j=0;;j++){
            ans=j*ii+i;
            if(ans%pi==p&&ans%ei==e)break;
        }
        if(ans<=d)ans+=days;
        if(ans>d)ans-=d;
        printf("Case %d: the next triple peak occurs in %d days.\n", cas++, ans);
    }
    return 0;
}


代码:同余定理版本

StatusAccepted
Time63ms
Memory652kB
Length443
LangG++
#include <iostream>
#include <cstdio>
using namespace std;
const int pi=23,ei=28,ii=33,days=21252;
int p, e, i, d;
const int a=6,b=19,c=2;
int main()
{
    int cas=1;
    while(~scanf("%d%d%d%d", &p,&e,&i,&d)&&p+e+i+d!=-4){
        int ans=(ei*ii*a*p + pi*ii*b*e + pi*ei*c*i)% days;
        if(ans<=d)ans+=days;
        if(ans>d)ans-=d;
        printf("Case %d: the next triple peak occurs in %d days.\n", cas++, ans);
    }
    return 0;
}