Codeforces Round 973题解(E)
E. Prefix GCD
假设我们从一个空集合
结论1:
每次选择使得其和当前
证明1:
假设当前的
使得
而正确方案中这个步骤应该选择的
结论2:
可以把正确方案的
替换成:
证明2:
设
则①的
②的
二者不同的部分满足
因为
这用到了两个点:
因此每次选择使得其和当前
优化
设
我们可以在开始计算前,将每个
事实上,我们每次选择一个
最后我们再把结果乘上
如果不进行这一步操作,则很有可能
时间复杂度
因为每个数最多有
int n;
int a[N];
void solve() {
cin >> n;
int gcd_all = 0;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
gcd_all = gcd(gcd_all, a[i]);
}
for (int i = 1; i <= n; i ++) {
a[i] /= gcd_all;
}
int cur = 0, cnt = 0;
int ans = 0;
for (int i = 1; i <= n; i ++) {
int min_v = INF;
for (int j = 1; j <= n; j ++) {
min_v = min(min_v, gcd(cur, a[j]));
}
cur = min_v;
cnt ++;
ans += cur;
if (cur == 1) {
ans += n - cnt;
break;
}
}
ans *= gcd_all;
cout << ans << '\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】