Codeforces Round 919 (Div. 2)

1|0基本情况

A、B秒了,C属于展现短板了。

2|0C. Partitioning the Array

k 范围不大,可以暴力。

难点就在于分组之后为了找到 m 对于每组相同位置元素的处理。

这题很明显是同余问题,但我对同余的了解也几乎就是知道同余。

找到几个数同余,可以用一个巧妙的方法。

假设这几个数对于 p 同余,那么显然这几个数除以 p 会余下相同的余数,

而直接对这几个数进行判断,很难发现他们同余(在不知道 p 的情况下)。

我们就可以利用上面的性质,既然余数相同,那么就随便选一个数,让另外几个数与这个数做差,自然做差的过程中余数被消掉了,这时再对这些差取 gcd,显然就是 p

当然这题 p>1

bool sol(int k, vector<int>& a) { int tot_gcd = 0; for (int i = 1; i <= n - k; i++) { tot_gcd = gcd(tot_gcd, abs(a[i + k] - a[i])); } return tot_gcd != 1; } void solve() { cin >> n; vector<int> a(n + 1); int ans = 0; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i * i <= n; i++) { if (n % i == 0) { if (i * i == n) { ans += sol(i, a); } else { ans += sol(i, a); ans += sol(n / i, a); } } } cout << ans << endl; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17963270.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示