[CP / Codeforces] C1. k-LCM (easy version) (Div. 2) - 1200*
前言
今晚有一场 Div. 3,我现在的 rating 是 1377,如果表现不是很拉胯的话就能上 specialist,得到全新的颜色——青色。
现在距离比赛还有 9 个多小时,开始有点紧张了……但我很清楚,分数本身并不是刷题的目的。如果我在这场比赛之后没能成为 specialist,只是说明我还不够格,仅此而已。
尽管如此,还是有点期待,而且每天还是要例行刷一刷构造题,这是今天的第一道。
进度
-
26:15.03 - 可恶啊,做不出来!这才只是 1200* 的题目!!难以想象那些大佬们所身处的境界。究竟是何等天才的头脑,才能在一分钟都不到的时间内如同吃饭喝水一般自然地秒杀这样的题目!难以想象!感觉晚上的比赛没什么希望了。唉。、
-
37:01.27 - AC,看了会儿视频逃避了下,然后回来 10 分钟解决了……
分析
这道题是 easy version,限制
和之前做过的许许多多的题目一样,一开始我总是没有思路。
但是,做题是一定需要思路的,如果光靠猜,那算不上做题,而且效率极其低下。
这道题最晦涩的概念莫过于最小公倍数了。我对它的认知不多,仅仅局限于知道最小公倍数的英文名——Least Common Multiple,知道它的值等于所有数的乘积除以它们的最大公因数,但这些知识对于解本题没有任何帮助,反而有可能会把问题变复杂。
我在纸上随便想了几个数,然后算出了它们的最小公倍数。不错,我发现了新的规律:最小公倍数一定大于等于最大的那个数。又因为,本题给出了最小公倍数小于等于
然而这个推论也没有任何作用。要枚举
但是我有了想法。
想到这里,我马上得到了一种可行的构造方法——1 (n-1)/2 (n-1)/2
,前提是
然后再考虑 2 (n-2)/2 (n-2)/2
了吧?然后我发现不行,准确地来说,不完全行。如果
于是我思考 k k 2k
不就满足题目的要求吗?!
至此,对于任何的
到这里已经汗流浃背了,不禁再次感叹,那些大佬究竟是怎么秒杀这种问题的……
代码
这次使用了 C++20 的 std::format
,并对比了使用 stream 和使用 format 的时间差异。仅从这道题来看,结论是:没有差异。以后都用 format 吧!
(如果你问我为什么不用 printf,原因有二。第一,printf 没有类型检查,不够安全;第二,printf 是一个 C 库函数,虽然 C++ 的界限和 C 本来就挺模糊的,但我个人还是倾向于尽可能地减少 C 库函数的使用,不然怎么体现出自己写的是 C++ 呢。)
void solve() { int n = 0, k = 0; std::cin >> n >> k; if (n & 1) { std::cout << std::format("1 {} {}\n", (n - 1) >> 1, (n - 1) >> 1); } else if (((n - 2) / 2) % 2 == 0) { std::cout << std::format("2 {} {}\n", (n - 2) >> 1, (n - 2) >> 1); } else { std::cout << std::format("{} {} {}\n", n >> 2, n >> 2, n >> 1); } }
后记
好久没写文章,感觉不太会说话了。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具