2020 ICPC 沈阳站 I - Rise of Shadows 题解
\(PS\):符号 \([\ \rm P\ ]\) 的意义是:当表达式 \(\rm P\) 为真则取值为 \(1\),为假则取值为 \(0\)。
题目大意
给你一个一天有 \(H\) 小时、一小时有 \(M\) 分钟的表和一个正整数 \(A\),问一天内有多少个整数时刻,使得分针与时针的夹角小于等于 \(\displaystyle\frac{2\pi A}{HM}\)。
题目分析
易知分针转速 \(w_1=\displaystyle \frac{2\pi}{M}\),时针转速 \(w_2=\displaystyle\frac{2\pi}{HM}\),设当前时刻为 \(T\);
一天有 \(HM\) 个整数时刻,即 \(T\in[0,HM)\);
于是对于每一个时刻,我们判断一下两个指针的夹角 \(\theta\) 是否小于等于 \(\displaystyle\frac{2\pi A}{HM}\) ,满足就贡献加加,最后输出总贡献即可。
方法一:数论
对于任意时刻 \(T\) 与两指针间的夹角 \(\theta\),显然有:
\]
注意到 \(\theta\in[0,2\pi]\),所以还要对 \(2\pi\) 取个模(分针转一圈又转回来了),即:
\]
同时因为两个指针之间的夹角可以选到两个数值,逆时针转有一个夹角,顺时针转有一个夹角,这里我们肯定是选更小的角来判断是否满足条件,即最终我们要求的是:
\]
可以转化为:
\]
把 \(\theta=\displaystyle\frac{2\pi(H-1)T}{HM}\mod{2\pi}\) 代入并化简得:
\]
此时我们其实就可以把 \(HM\) 看作是 \(2\pi\),\(H-1\) 看作是每过一个时刻两个指针夹角的变化量,然后分两种情况考虑:
一、当 \(\mathbf {A=HM/2}\) 时,问题等价于”一天内有多少个整数时刻,使得分针与时针的夹角小于等于 \(\pi\)“,显然每个时刻都满足(如果顺时针看夹角大于 \(\pi\),那逆时针看一定小于,反之亦然),此时答案为 \(HM\),特判即可;
二、当 \(\mathbf {A\neq HM/2}\) 时,若有 \(T(H-1)\mod{HM}\leq A\),则一定不会有 \(T(H-1)\mod{HM}\geq HM-A\),所以答案就是这两部分的贡献相加。
我们令 \(G=\gcd(H-1,HM)\)。
先计算式子的左边:
\]
当 \(G=1\) 时 ,因为 \(T\in[0,HM)\),构成了一个模 \(HM\) 的完全剩余系,由完全剩余系的性质可得 \(T(H-1)\mod{HM}\) 也是一个完全剩余系,即它一定取遍了 \(0\sim HM-1\) 的每一个数,此时我们就不用关心到底在哪个时刻造成了贡献,只需知道范围内有多少个数满足小于等于 \(A\) 即可,显然有 \(0\sim A\) 总共 \(A+1\) 个数满足,因此这部分的贡献就是 \(A+1\)。
当 \(G\neq1\) 时,我们利用同余的另一个性质: \(\displaystyle ac\equiv bc\pmod d\iff a\equiv b\pmod{\frac{d}{(c,d)}}\),把式子转化为:
\]
相当于我们把 \(T\in[0,HM)\) 平均分成了 \(G\) 段,每一段的 \(T\) 都构成了一个模 \(\displaystyle\frac{HM}{G}\) 的完全剩余系,此时这里的每一段其实就等价于上面 \(G=1\) 的情况,只是 \(T\) 的范围和模数变了下而已,因此每段都造成了 \(\displaystyle \lfloor\frac AG\rfloor+1\) 的贡献,左边的总贡献就是 \(G*(\displaystyle \lfloor\frac AG\rfloor+1)\)。
再看式子右边:
\]
同样地,当 \(G=1\) 时,跟上面一样分析一波,发现其实是一样的思路(显然左边跟右边造成的贡献是对称的),只不过因为 \(T\) 不能取到 \(HM\),所以贡献只有 \(A\)(\(HM-A\sim HM-1\) 共有 \(A\) 个数)。
当 \(G\neq1\) 时,也同上,把 \(T\) 分成 \(G\) 段,右边的总贡献就是 \(G*\displaystyle \lfloor\frac AG\rfloor\)。
因此最终答案就是左边贡献和右边贡献之和,即 \(G*(\displaystyle 2\lfloor\frac AG\rfloor+1)\)。
Code
#include<bits/stdc++.h>
using namespace std;
int main(){
long long H,M,A;
cin >> H >> M >> A;
if(H*M==A*2){
cout << H*M;
}
else {
long long G=__gcd(H-1,H*M);
cout << G*(2*(A/G)+1);
}
}
方法二:类欧几里得
待填坑~~

2020 ICPC 沈阳站 I - Rise of Shadows 题解的更多相关文章
- 2016 ACM/ICPC 沈阳站 小结
铜铜铜…… 人呐真奇怪 铁牌水平总想着运气好拿个铜 铜牌水平总想着运气好拿个银 估计银牌的聚聚们一定也不满意 想拿个金吧 这次比赛挺不爽的 AB两道SB题,十分钟基本全场都过了 不知道出这种题有什么意 ...
- HDU 5950Recursive sequence ICPC沈阳站
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 2015 ICPC 沈阳站M题
M - Meeting Time Limit:6000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit ...
- 2016ACM/ICPC亚洲区沈阳站-重现赛赛题
今天做的沈阳站重现赛,自己还是太水,只做出两道签到题,另外两道看懂题意了,但是也没能做出来. 1. Thickest Burger Time Limit: 2000/1000 MS (Java/Oth ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Thickest Burger Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Relative atomic mass Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 2015ACM/ICPC亚洲区沈阳站 Pagodas
Pagodas Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
随机推荐
- Shell系列(25)- 条件判断之文件权限
按照文件权限进行判断 读.写.执行等选项权限,只要有,就返回真 不会按照所属者,所属用户组,其他用户进行区分 先判断文件是否存在,再去判断选项权限 测试选项 作用(标红熟记) -r 文件 判断该文件是 ...
- 低代码+RPA+AI,能否让ERP焕发下一春?
从2004年开始,国内ERP项目的实施便在各大企业热火朝天地展开,2014年,国内大中型企业已经基本完成了ERP系统的普及.ERP已经在大中型企业中成为不可或缺的关键信息系统.企业核心业务的流转与管控 ...
- 完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径。)
完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径.) 错误原因 读出文件的路径需要有被拷贝的文件名,否则无法解析地址 源代码(用 ...
- 鸿蒙内核源码分析(进程镜像篇)|ELF是如何被加载运行的? | 百篇博客分析OpenHarmony源码 | v56.01
百篇博客系列篇.本篇为: v56.xx 鸿蒙内核源码分析(进程映像篇) | ELF是如何被加载运行的? | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应 ...
- P2350-[HAOI2012]外星人【线性筛】
正题 题目链接:https://www.luogu.com.cn/problem/P2350 题目大意 给出\(N\)质因数分解之后的结果,求每次\(N=\varphi(N)\),多少次后\(N=1\ ...
- EasyExcel无法用转换器或者注解将java字段写入为excel的数值格式
需求: 在用easyExcel导出报表时,碰到需要将数据转换为数值or货币格式的需求 过程: 1.首先采取转换器的形式 @Override public CellData convertToExcel ...
- 软件测试工程师简历要怎么写,才能让HR看到
作为软件测试的从业者,面试或者被面试都是常有的事. 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息.过往经历等. 面试者希望通过简历把自己最好的一面体现给面试官,所以在这场 ...
- 设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 。写出程序。
题目:设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 .写出程序. 代码实现 public class ThreadTest{ private int j; c ...
- 初探计算机网络之TCP/IP网络协议
网络协议 在计算机诞生以来,从最原始的单机模式到现在多台计算机协同工作,形成计算机网络,从前很难想象的信息共享.多机合作.大规模计算在今天也早已成了现实.在早期,计算机网络需要解决的痛点,就是怎样 ...
- Editing Tools(编辑工具)
编辑工具 # Process: 修剪线 arcpy.TrimLine_edit("", "", "DELETE_SHORT") # Proc ...