CF585E Present for Vitalik the Philatelist 题解
题意
- 有一个包含 个 的整数的可重集合。
- 要求满足条件的一个元素 和一个集合 的方案数。
- 条件:,,。
- ,答案对 取模。
题解
枚举 ,设 为 的倍数的个数,则 对应的方案数为 。
显然有算重的,容斥一下即可,容斥系数恰好为莫比乌斯函数的相反数。
时间复杂度 。
代码
const int N = 5e5 + 7, M = 1e7 + 7;
int n, m, x, c[M], p[M], cnt, v[M];
modint num[N], miu[M], ans;
int main() {
rd(n), num[0] = 1;
for (int i = 1; i <= n; i++) rd(x), m = max(m, x), c[x]++, num[i] = num[i-1] * 2;
miu[1] = 1;
for (int i = 2; i <= m; i++) {
if (!v[i]) v[i] = p[++cnt] = i, miu[i] -= 1;
for (int j = 1; j <= cnt && i * p[j] <= m && p[j] <= v[i]; j++)
v[i*p[j]] = p[j], miu[i*p[j]] = p[j] == v[i] ? 0 : -miu[i];
}
for (int i = 1; i <= m; i++) {
cnt = 0;
for (int j = i; j <= m; j += i) cnt += c[j];
ans += (-miu[i]) * (n - cnt) * (num[cnt] - 1);
}
print(ans);
return 0;
}
评论
暂无已公开评论。