http://ac.jobdu.com/problem.php?pid=1142
此题利用了中国剩余定理
参考了
1.http://www.cnblogs.com/My-Sunshine/p/4830388.html
2.http://blog.csdn.net/sinat_30126425/article/details/52154948
代码来自于:参考2
#include <stdio.h>
#define ll long long
#define ld long double
static ll m[3],a[3];
void extend_Euclide(ll a, ll b, ll &x, ll&y){
if (b == 0) {
x = 1;
y = 0;
return;
}
extend_Euclide(b,a%b,x,y);
ll tmp = x;
x = y;
y = tmp - (a/b)*y;
}
ll CRT(){
ll M = 1;
ll ans = 0;
for (int i = 0; i < 3; ++i) {
M*=m[i];
}
for (int i = 0; i < 3; ++i) {
ll x,y;
ll Mi = M/m[i];
extend_Euclide(Mi,m[i],x,y);
ans = (ans + Mi*x*a[i])%M;
}
if(ans<0) ans+=M;
return ans;
}
int main(){
// freopen("in/1142.in","r",stdin);
int p,e,i,d,nCase=1;
m[0]=23,m[1]=28,m[2]=33;
while(scanf("%d%d%d%d",&p,&e,&i,&d) !=EOF){
if(p==-1 && e==-1 && i ==-1 && d==-1) break;
a[0] = p,a[1] = e,a[2] = i;
ll k = CRT();
if(k==0) k = 21252;
if(k < d) k+=21252;
d = (int) k-d;
printf("Case %d: the next triple peak occurs in %d days.\n",nCase++,d);
}
}
暴力也可解:
#include <stdio.h>
int main(){
int p,e,i,d;
int nCase = 0;
while(scanf("%d%d%d%d",&p,&e,&i,&d)!=EOF){
nCase++;
if(p==e && p==i && p==d && p==-1) break;
for (int n = 1; n <=21252 ; ++n) {
if((n+d-p)%23 == 0 && (n+d-e)%28 == 0&& (n+d-i)%33 == 0){
printf("Case %d: the next triple peak occurs in %d days.\n",nCase,n);
break;
}
}
}
}