首页 > 其他 > 详细

biorhythms

时间:2018-10-13 00:59:48      阅读:122      评论:0      收藏:0      [点我收藏+]

传送门

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(‘\n‘)

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.\n",tot,cur);
    }
    return 0;
}

 

biorhythms

原文:https://www.cnblogs.com/captain1/p/9781292.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!