正题
题目链接:http://poj.org/problem?id=1006
题目大意
若干个p,e,i,dp,e,i,dp,e,i,d。已经知道
{(d+x)≡p(mod23)(d+x)≡e(mod28)(d+x)≡i(mod33)\left\{\begin{matrix} (d+x)\equiv p(mod\ 23) \\ (d+x)\equiv e(mod\ 28) \\ (d+x)\equiv i(mod\ 33) \end{matrix}\right.⎩⎨⎧(d+x)≡p(mod 23)(d+x)≡e(mod 28)(d+x)≡i(mod 33)
求最小的xxx
中国剩余定理
m=∏i=1nmi,Mi=m/mi,Miti≡1(modmi)m=\prod_{i=1}^nm_i,M_i=m/m_i,M_it_i\equiv 1(mod\ m_i)m=∏i=1nmi,Mi=m/mi,Miti≡1(mod mi)然后对于方程
{x≡a1(modm1)x≡a2(modm2)...x≡an(modmn)\left\{\begin{matrix} x\equiv a_1(mod\ m_1) \\ x\equiv a_2(mod\ m_2) \\ ... \\ x\equiv a_n(mod\ m_n) \end{matrix}\right.⎩⎪⎪⎨⎪⎪⎧x≡a1(mod m1)x≡a2(mod m2)...x≡an(mod mn)
有
x=∑i=1NaiMi,tix=\sum_{i=1}^Na_iM_i,t_ix=i=1∑NaiMi,ti
解题思路
因为3个mmm是固定的,所以直接中国剩余定理计算公式就好了。
ans=(5544∗p+14421∗e+1288∗i−d+21252)%21252ans=(5544*p+14421*e+1288*i-d+21252)\%21252ans=(5544∗p+14421∗e+1288∗i−d+21252)%21252
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int p,e,i,d,ans,t;
int main()
{while(scanf("%d%d%d%d",&p,&e,&i,&d)){if(d<0) return 0;t++; ans=(5544*p+14421*e+1288*i-d+21252)%21252;if(!ans) ans=21252;printf("Case %d: the next triple peak occurs in %d days.\n",t,ans);}
}