[CP / Codeforces] C1. k-LCM (easy version) (Div. 2) - 1200*

C1. k-LCM (easy version)

前言

今晚有一场 Div. 3,我现在的 rating 是 1377,如果表现不是很拉胯的话就能上 specialist,得到全新的颜色——青色。

现在距离比赛还有 9 个多小时,开始有点紧张了……但我很清楚,分数本身并不是刷题的目的。如果我在这场比赛之后没能成为 specialist,只是说明我还不够格,仅此而已。

尽管如此,还是有点期待,而且每天还是要例行刷一刷构造题,这是今天的第一道。

进度

  • 26:15.03 - 可恶啊,做不出来!这才只是 1200* 的题目!!难以想象那些大佬们所身处的境界。究竟是何等天才的头脑,才能在一分钟都不到的时间内如同吃饭喝水一般自然地秒杀这样的题目!难以想象!感觉晚上的比赛没什么希望了。唉。、

  • 37:01.27 - AC,看了会儿视频逃避了下,然后回来 10 分钟解决了……

分析

这道题是 easy version,限制 k=3。目标是构造 k 个元素(即 3 个元素)的数组,使这些元素的和为 n,且它们的最小公倍数 n2

和之前做过的许许多多的题目一样,一开始我总是没有思路。

但是,做题是一定需要思路的,如果光靠猜,那算不上做题,而且效率极其低下。

这道题最晦涩的概念莫过于最小公倍数了。我对它的认知不多,仅仅局限于知道最小公倍数的英文名——Least Common Multiple,知道它的值等于所有数的乘积除以它们的最大公因数,但这些知识对于解本题没有任何帮助,反而有可能会把问题变复杂。

我在纸上随便想了几个数,然后算出了它们的最小公倍数。不错,我发现了新的规律:最小公倍数一定大于等于最大的那个数。又因为,本题给出了最小公倍数小于等于 n2 的限制,那么这些数的最大值一定小于等于 n2

然而这个推论也没有任何作用。要枚举 1n2 的数吗?不行,时间复杂度会爆炸。

但是我有了想法。1 是一个特殊的数字,或许我可以规定其中一个元素为 1,这样就减少了一个自由度!并且,1 不会影响最小公倍数的结果,因为任何整数都是 1 的倍数。这样一来,问题就变成了“构造两个数,使得它们的和为 n1,且最小公倍数小于等于 n2”。

想到这里,我马上得到了一种可行的构造方法——1 (n-1)/2 (n-1)/2,前提是 n 为奇数。一半的问题解决了!!

然后再考虑 n 为偶数的情况,依样画葫芦,这次应该就是 2 (n-2)/2 (n-2)/2 了吧?然后我发现不行,准确地来说,不完全行。如果 n4 的倍数,那么 n22 会变成奇数,导致最小公倍数变为 2×n22=n2>n2

于是我思考 4 这个数字。n4 的倍数,也就是说 n=4k,那么n2=2k。那么,k k 2k 不就满足题目的要求吗?!

至此,对于任何的 n(奇数、不是 4 的倍数的偶数、4 的倍数),都有相应的数组构造方法,于是本题解决。

到这里已经汗流浃背了,不禁再次感叹,那些大佬究竟是怎么秒杀这种问题的……

代码

这次使用了 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);
}
}

后记

好久没写文章,感觉不太会说话了。。

posted @   ZXPrism  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示