1 条题解
-
0
自动搬运
来自洛谷,原作者为

xinxin2022
江畔何人初见月,江月何年初照人。||主页:https://www.luogu.com/paste/tvmkisij搬运于
2025-08-24 21:17:56,当前版本为作者最后更新于2025-03-12 20:39:31,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
直接做显然不好做,发现时间长度为 ,考虑与解法有何关联。
显然当 时,由于存在红灯和绿灯两种状态,可以使两个灯回到同一起点的时间为 。
而若 不互质,那么相当于有 段连续时间两灯状态会相等,可以先同时除去 ,计算出答案后再乘上 ,也就是被除掉的部分。
那么对于 ,计算答案的方式如下:
易知 不会都是偶数。
考虑分类讨论前 秒和后 秒。
若存在一个偶数,那么相当于该灯在前 秒中奇数次改变了状态,那么前 秒和后 秒状态显然相反,另一个灯状态确却是相等的,那么相当于该灯补上了前 秒的空缺时间,计算出另一个灯在 秒内的绿灯时间即可,即 。
若都为奇数,两灯在前 秒和后 秒的状态均相反,只需要知道 秒内的答案即可。
由于两数均为奇数, 改变状态时会覆盖 同色连续段的所有点,而 显然只会使一个同色点改为异色点,一个异色点改为同色点,显然不对答案产生影响。
考虑计算 秒内所有 的改变,因所有改变状态点均被扫到,绿灯时长自然为 。
对 的改变计算也同理,时长为 。
由于两数均为奇数,前 秒状态与后 秒相反,答案如下:
即:
所以答案为:
最后乘上 即可。
代码如下:
#include<bits/stdc++.h> using namespace std; #define int long long int p,q,w; signed main(){ cin>>p>>q; w=__gcd(p,q); p/=w; q/=w; if((p%2)&&(q%2)) cout<<w*w*((p*q+1)/2); else cout<<w*w*(p*q)/2; return 0; }
- 1
信息
- ID
- 9912
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者