题目大意:找比某一个数大的,对23,28,33三个数模运算得到结果固定的数。
解题方法:中国剩余定理的简单应用,因为数据太小也可以考虑直接暴力。关于中国剩余定理,我认为刘汝佳的训练指南上面就讲的非常好了,以后如果有时间我再把这部分补充上来。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b==0)
{
x = 1; y = 0;
return a;
}
ll d = exgcd(b,a%b,x,y);
ll temp = x;
x = y;
y = temp - a/b*y;
return d;
}
// n个方程 x = a[i] (mod m[i]) ( 0 =< i < n)
ll china(int n, int* a, int* m)
{
ll M = 1, d, y, x = 0;
for(int i = 0; i<n; i++)
{
M *= m[i];
}
for(int i = 0; i<n; i++)
{
ll w = M / m[i];
exgcd(m[i], w, d, y);
x = (x + y*w*a[i]) % M;
}
return (x+M)%M;
}
int main()
{
int m[5] = {23,28,33};
int a[5];
int date = 0, k = 1;
while(1)
{
for(int i = 0; i<3; i++)
{
cin>>a[i];
}
cin>>date;
if(date==-1) break;
int ans = china(3,a,m);
ans = (ans - date) % 21252;
if(ans<=0) ans += 21252;
printf("Case %d: the next triple peak occurs in %d days.\n", k++, ans);
}
//cout << "Hello world!" << endl;
return 0;
}