Password:nefu
都是中文。。。
解题思路:
根据题意,我们可以分析得到如下几个等式:
(n+d)%23=p;
(n+d)%28=e;
(n+d)%33=i;
上述的 n 为下一次三个高峰同天的时间
因为23,28 和 33 都是两两互素的所以就更简单了,m = 23 * 33 * 28 = 21252;所以 这就让我们想到了中国剩余定理,只需要扩展欧几里得搞一下就好了(中国剩余定理还是离散的时候学的呢。。。。),注意当 n == 0 的时候我们要输出的是21252,基本上就可以写代码了.
My Code:
#include <iostream>
#include <cstdio>
using namespace std;
///(n+d)%23=p; (n+d)%28=e; (n+d)%33=i
void exgcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return;
}
int x1, y1;
exgcd(b, a%b, x1, y1);
x = y1;
y = x1 - (a/b)*y1;
}
int main()
{
int d, p, e, i, cas = 1;
while(cin>>p>>e>>i>>d)
{
if(p < 0)
break;
int m = 21252;
int M1 = 924;
int M2 = 759;
int M3 = 644;
int x1, x2, x3, y;
exgcd(M1, 23, x1, y);
x1 = (x1%23+23)%23;
exgcd(M2, 28, x2, y);
x2 = (x2%28+28)%28;
exgcd(M3, 33, x3, y);
x3 = (x3%33+33)%33;
int ans = ((p*M1*x1+e*M2*x2+i*M3*x3-d)%m+m)%m;
if(ans == 0)
ans = m;
printf("Case %d: the next triple peak occurs in %d days.\n",cas++,ans);
}
return 0;
}