CF1780B GCD Partition
从 \(k\) 的角度出发,可以发现一定存在某种 \(k = 2\) 的划分方式,使得最终获得的分数最大。
为什么呢?
假定划分为 \(k = 3\) 时取得了最大分数,即 \(\gcd(b_1, b_2, b_3) = g\)。
设 \(b_1 = c_1g, b_2 = c_2g, b_3 = c_3g\)。则 \(\gcd(b_1 + b_2, b_3) = \gcd((c_1 + c_2)g, c_3g) \ge g\)。
而 \(g\) 是能获取到的最大分数,所以有 \(\gcd(b_1 + b_2, b_3) = \gcd(b_1, b_2, b_3) = g\)。
显然可以推广到任意的 \(k\)。
也就是说,对于任意取得最大分数的划分方式,都可以通过将多块并为一块的方式转化为 \(k = 2\) 的划分方式。
然后用前缀和加速区间求和,模拟所有 \(k = 2\) 的情况就好啦。
代码:
#include <bits/stdc++.h>
#define MAXN 200100
using namespace std;
typedef long long ll;
int T, n, maxa, a[MAXN];
ll sum[MAXN];
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
ll ans = 1;
for (int i = 1; i < n; i++) ans = max(ans, __gcd(sum[i], sum[n] - sum[i]));
printf("%lld\n", ans);
}
}
作者:chy12321
出处:https://www.cnblogs.com/chy12321/p/17067589.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】