CF1612G Max Sum Array
Max Sum Array
题面描述
- 给定一个长为
的序列 。 - 序列
满足:对于所有 , 在 中出现了 次。 - 定义一个序列
的值如下:
- 求满足条件的
的最大值,及在取最大值时有多少种序列 。 。
Solution
分开讨论每一种颜色。
假设一个颜色出现的位置为
对于方案的求法,当两个位置的系数相等的时候,这两个位置一定可以交换且不影响答案。所以记
如果直接按照上面的做法做,时间复杂度是
时间复杂度
Code
int N, cnt[_N];
mint fac[_N];
void init(int n) {
fac[0] = 1; For(i, 1, n) fac[i] = fac[i-1] * i;
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cin >> N; init(M);
For(i, 1, N) {
int x; cin >> x;
++cnt[M-x], --cnt[M+x];
}
i64 sum = 0;
mint ans = 0, tot = 1;
auto calc = [](i64 l, i64 r)->mint {
return (l + r) * (r - l + 1) / 2 % mod;
};
For(i, 2, M << 1) {
cnt[i] += cnt[i-2];
ans += calc(sum + 1, sum + cnt[i]) * (mint(i) - M + 1);
tot *= fac[cnt[i]];
sum += cnt[i];
}
cout << ans << ' ' << tot << '\n';
}
标签:
计数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步