题目描述:

人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。

输入格式:

输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。

当p = e = i = d = -1时,输入数据结束。

输出格式:

从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。

采用以下格式:

Case 1: the next triple peak occurs in 1234 days.

注意:即使结果是1天,也使用复数形式“days”。

样例输入:

0 0 0 0
0 0 0 100
5 20 34 325
4 5 6 7
283 102 23 320
203 301 203 40
-1 -1 -1 -1

样例输出:

Case 1: the next triple peak occurs in 21252 days.

Case 2: the next triple peak occurs in 21152 days.

Case 3: the next triple peak occurs in 19575 days.

Case 4: the next triple peak occurs in 16994 days.

Case 5: the next triple peak occurs in 8910 days.

Case 6: the next triple peak occurs in 10789 days.

【提示】

数据范围与提示:

所有给定时间是非负的并且小于 365,所求的时间小于 21252。


因为23、28、33互质,所以我们很容易想到,这道题的中心思想就是“中国剩余定理”,只不过稍稍增加了一点细节罢了。因为要求输出的时间是距离给定时间d的天数,所以不能单纯的解同余方程组。

但是,我要告诉你,这道题目真的肥肠简单,就算是直接解同余方程组再暴力循环都能过!!!先放上我暴力的代码

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m=**,a[],b,n;
int mm[];
int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(b==)
{
d=a;
x=;
y=;
}
else
{
exgcd(b,a%b,d,x,y);
int t=x;
x=y;
y=t-a/b*y;
}
}
int main()
{
mm[]=;mm[]=;mm[]=;int k=;
while(scanf("%lld%lld%lld%lld",&a[],&a[],&a[],&b)!=EOF)
{
k++;ll ans=;
if(a[]==-)break;
for(int i=;i<=;i++)
{
ll d,x,y,mi=m/mm[i];
exgcd(mi,mm[i],d,x,y);
ans=(ans+mi*x*a[i])%m;
}
ll xx=(ans+m)%m;
if(xx>b)n=xx-b;
else if(ans<=b)
{
for(int i=;;i++)
{
if(ans+i*m>b)
{
n=ans+i*m-b;
break;
}
}
}
else
{
for(int i=-;;i--)
{
if(ans+i*m<b)
{
n=ans+(i+)*m-b;
break;
}
}
}
printf("Case %d: the next triple peak occurs in %lld days.\n",k,n);
}
return ;
}

蒟蒻只会暴力

但是做完以后我瞟了一眼隔壁的肖玉梅童鞋的代码,突然发现自己好弱智吖,这么简单的题我tm居然还暴力...关键是这道题已经给出了数据范围,所以根本没必要循环的好伐(´-ι_-`)论数据范围和审题的重要性!!!

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll lcm=;//21252=23*28*33
ll m[],a[],d;
void exgcd(ll a,ll b,ll &gcd,ll &x,ll &y)
{
if(!b)
{
gcd=a;
x=;
y=;
}
else
{
exgcd(b,a%b,gcd,x,y);
ll t=x;x=y;y=t-a/b*y;
}
}
int main()
{
int cnt=;
m[]=;m[]=;m[]=;
while(~scanf("%lld%lld%lld%lld",&a[],&a[],&a[],&d))
{
cnt++;
ll ans=,Mi,gcd,x,y;
if(a[]==&&a[]==&&a[]==&&d==)//数据最大不超过21252 ,所以可以直接输出
{
printf("Case %d: the next triple peak occurs in %lld days.\n",cnt,lcm);
continue;
}
if(a[]==-)//写一个就够了,没必要全写出来,因为题目已说明所有给定时间是非负的
break;
for(int i=;i<=;i++)//中国剩余定理的应用
{
Mi=lcm/m[i];
exgcd(Mi,m[i],gcd,x,y);
ans=((ans+Mi*x*a[i])%lcm+lcm)%lcm;
}
ans=((ans%lcm)-(d%lcm)+lcm)%lcm;
if(ans<=) ans+=lcm;//若小于0,直接加上21252,还是因为数据最大不超过21252
printf("Case %d: the next triple peak occurs in %lld days.\n",cnt,ans);
}
return ;
}

这才是本题正确的打开方式

Biorhythms(信息学奥赛一本通 1639)的更多相关文章

  1. $ybt\ 【信息学奥赛一本通】题解目录$

    [信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...

  2. 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目

    目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...

  3. 【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数

    给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS #in ...

  4. 信息学奥赛一本通算法(C++版)基础算法:高精度计算

    高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...

  5. 食物链【NOI2001】(信息学奥赛一本通 1390)

    [题目描述] 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...

  6. 信息学奥赛一本通 提高篇 序列第k个数 及 快速幂

    我是传送门 这个题首先是先判断是等差还是等比数列 等差的话非常简单: 前后两个数是等差的,举个栗子: 3 6 9 12 这几个数,(我感觉 1 2 3 4并说明不了什么) 每次都加3嘛,很容易看出,第 ...

  7. 【NOI2002】荒岛野人(信息学奥赛一本通 1637)(洛谷 2421)

    题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...

  8. X-factor Chain(信息学奥赛一本通 1628)

    题目描述 输入正整数 x,求 x 的大于 1 的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数. 输入 多组数据,每组数据一行,包含一个正整数 x. 对于全部数据 ...

  9. 【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)

    题目描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在课堂上,老师讲解了如何求 ...

随机推荐

  1. MySQL子查询结果集是否有记录

    Mark SELECT tu.id userId, tu.avatar_url avatarUrl, tu.wx_nick_name wxNickName, tu.city city, (select ...

  2. 搭建RocketMQ集群

    一.环境及准备 集群环境: 软件版本: 部署前操作: 关闭防火墙,关闭selinux(生产环境按需关闭或打开) 同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器 [root@es1 ~]# ...

  3. 使用Net Mail发送邮件

    最近用到了发送邮件这个功能,简单记录一下案例.代码如下: using System; using System.Collections.Generic; using System.Linq; usin ...

  4. DatetimeHelper类的编写

    公共类 DAtaTimeHelper类的编写 public class Appointment { public DateTime StartDate { get; set; } public Dat ...

  5. 安全漏洞系列(二)---站点信息侦测(C# MVC)

    参考地址:https://jingyan.baidu.com/article/77b8dc7fa657c26174eab631.html 概述:站点信息侦测漏洞会检测到用的版本信息等,然后借此进行一些 ...

  6. springboot的pom.xml配置

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  7. Spring Cloud微服务架构升级总结

    ↵ [编者的话]微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”.文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组 ...

  8. Navicat连接mysql报错1862

    昨天重新设置了mysql的密码 因为之前一直都是不用密码登录的 因为是公司数据库还是要密码 但是加了密码我今天打开 然后再控制台重新设置一下密码就好了 mysql -u root -p SET PAS ...

  9. Vue递归组件实现层层嵌套显示数据

    问题来自朋友...记录一下 需求是表格头部后端返回的数据中是不确定的 n维数据,表头存在于 listVo 字段中,如何实现层层显示呢? 温馨提示,以下内容为5张大图,请打开 WIFI 享用... 以下 ...

  10. Git恢复删除的分支

    1.使用 git reflog 命令查看显示整个本地仓储的commit,包括所有branch的commit,甚至包括已经撤销的commit. 2.找到我们想要恢复的分支 ,可以看到我们当时commit ...