Biorhythms(信息学奥赛一本通 1639)
题目描述:
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为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)的更多相关文章
- $ybt\ 【信息学奥赛一本通】题解目录$
[信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...
- 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目
目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...
- 【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数
给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS #in ...
- 信息学奥赛一本通算法(C++版)基础算法:高精度计算
高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...
- 食物链【NOI2001】(信息学奥赛一本通 1390)
[题目描述] 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...
- 信息学奥赛一本通 提高篇 序列第k个数 及 快速幂
我是传送门 这个题首先是先判断是等差还是等比数列 等差的话非常简单: 前后两个数是等差的,举个栗子: 3 6 9 12 这几个数,(我感觉 1 2 3 4并说明不了什么) 每次都加3嘛,很容易看出,第 ...
- 【NOI2002】荒岛野人(信息学奥赛一本通 1637)(洛谷 2421)
题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...
- X-factor Chain(信息学奥赛一本通 1628)
题目描述 输入正整数 x,求 x 的大于 1 的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数. 输入 多组数据,每组数据一行,包含一个正整数 x. 对于全部数据 ...
- 【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)
题目描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在课堂上,老师讲解了如何求 ...
随机推荐
- C# 分解文件路径目录
利用正则表达式分解文件目录 [^\\].*?[\\$]|[^\\].*?\.\w+|\w+ 测试字符串:C:\Users\wppcn\Desktop\中文长字符第一次测试\新建文件夹1\新建文件夹2\ ...
- C++中的Point类与vector类的简单处理
首先设计Vector与Point的表示方法,再依次完善两个类中的构造函数,复制构造函数等. 向量由两个点表示,当进行运算的时候,转化起点坐标为(0,0): 第14行:由于Vector需要用到Point ...
- 洛谷 p1387最大正方形
洛谷 p1387最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入格式 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来 ...
- HTML中的音频 视频 的播放代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- vulnhub AI: Web: 1
vulnhub AI: Web: 1 提取flag攻略 导入虚拟机,开机. 扫描NAT的C段,确定虚拟机IP和开放端口. 尝试访问该网站 发现什么都没有,抽根烟冷静一下...... 来波目录扫描吧 使 ...
- 实验吧——加了料的报错注入(exp报错注入)
题目地址:http://ctf5.shiyanbar.com/web/baocuo/index.php 先查看页面源码得到提示知道了后台执行的sql语句,很常规的查询 测试了一个报错函数发现如下回显, ...
- vue-router 在新窗口打开页面的功能
项目中,需要点击链接后再新窗口打开页面,大家知道vue是单页面应用开发框架,那么也不是不可以实现这个功能 很简单,详情看下面 1.<router-link>标签实现新窗口打开 <ro ...
- java mybatis Column 'AAA' in where clause is ambiguous
今天在java mybatis项目中遇到一个问题,“java mybatis Column 'AAA' in where clause is ambiguous”, 这是由于在多表连接查询的时候,遇上 ...
- ssh免密登录(公钥私钥)指令
1.在.ssh目录中执行ssh-keygen -t rsa命令生成两个秘钥,公钥(id_rsa.pub)和私钥(id_rsa) 2.ssh-copy-id -i id_rsa.pub 对方用户名@对方 ...
- VMWare虚拟机出现问题
软件版本:VMware ESXi 5.5.0 服务器型号: Dell R720 问题经过: 某天ssh登录其中一个虚拟机,报错:kernel:BUG: soft lockup - CPU#6 stuc ...