biorhythms

传送门

luogu简化了题意而且提供了翻译。

直接开做,这题可以选择使用CRT,我也使用了……但是其实似乎暴力也可以。

我们老套的CRT操作,这样每次对于输入的值直接乘一下就行。

注意特判的时候如果四个值都是0的话要输出0.

看一下代码(CRT的内容在代码里)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define pr pair<int,int>
#define mp make_pair
#define fi first
#define sc second
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('
')

using namespace std;
typedef long long ll;
const int N = 200005;
const int INF = 1000000009;

int read()
{
    int ans = 0,op = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
    if(ch == '-') op = -1;
    ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
    ans *= 10;
    ans += ch - '0';
    ch = getchar();
    }
    return ans * op;
}

int exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
    x = 1,y = 0;
    return a;
    }
    int d = exgcd(b,a%b,y,x);
    y -= a / b * x;
    return d;
}

int M1,M2,M3,x,y,e1,e2,e3,M,p,e,i,d,cur,tot;

int main()
{
    M1 = 28 * 33,M2 = 23 * 33,M3 = 23 * 28,M = 21252;//先构造
    exgcd(M1,23,x,y),x = (x + 23) % 23,e1 = M1 * x;
    exgcd(M2,28,x,y),x = (x + 28) % 28,e2 = M2 * x;
    exgcd(M3,33,x,y),x = (x + 33) % 33,e3 = M3 * x;//求出mod每一个给定的数余1,剩下能整除的一组数
    while(++tot)
    {
    p = read(),e = read(),i = read(),d = read();
    if(p == -1 && e == -1 && i == -1 && d == -1) break;
    cur = p * e1 + e * e2 + i * e3,cur %= M;//解不定方程一样把这个解乘以本次输入的数再相加
    cur -= d,cur = (cur+M) % M;
    if(d == 0 && cur == 0) cur = M;
    printf("Case %d: the next triple peak occurs in %d days.
",tot,cur);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/captain1/p/9781292.html