题目概述
人体的体力每23天会达到峰值,情感每28天会达到峰值,智力每33天会达到峰值,一个人在a天体力达到峰值,b天情感达到峰值,c天智力达到峰值,求这个人下一次体力情感智力均达到峰值的天数减去d。
解题报告
我们的目的是求
S=a1+T1∗k1=a2+T2∗k2=a3+T3∗k3
。也就是说:
S≡a1(mod
T1)
S≡a2(mod
T2)
S≡a3(mod
T3)
用中国剩余定理求解即可(题目太水,可以暴力枚举水过=_=)。
示例程序
using namespace std;
const
int maxn=
3,T=
21252;
int a[maxn+
5],b[maxn+
5],st,ans;
int exgcd(
int a,
int b,
int &
x,
int &
y)
{
if (!b) {
x=
1;
y=
0;
return a;}
int r=exgcd(b,a
%b,
x,
y),t=
x;
x=
y;
y=t-a/b
*y;
return r;
}
int China(
int *w,
int *m,
int n)
{
int lcm=
1,ans=
0;
for (
int i=
1;i<=n;i++) lcm
*=m[i];
for (
int i=
1;i<=n;i++)
{
int x,
y,M=lcm/
m[i];exgcd(M,
m[i],
x,
y);
ans=(ans+
x*M*w[i])
%lcm;
}
return (ans+lcm)
%lcm;
}
int main()
{
freopen(
"program.in",
"r",stdin);
freopen(
"program.out",
"w",stdout);
b[
1]=
23;b[
2]=
28;b[
3]=
33;
scanf(
"%d%d%d%d",&a[
1],&a[
2],&a[
3],&st);
int te=
0;
while (~a[
1]||~a[
2]||~a[
3]||~st)
{
ans=(China(a,b,
3)-st)
%T;
if (ans<=
0) ans+=T;
printf(
"Case %d: the next triple peak occurs in %d days.\n",++te,ans);
scanf(
"%d%d%d%d",&a[
1],&a[
2],&a[
3],&st);
}
return 0;
}