C++ 编程实现:计算集合中满足倍数关系的子集数量
#include
const int MOD = 1e9 + 7;
vector
int main() {
int n;
cin >> n;
vector
vector<int> cnt(1e6 + 1); // cnt[i] 表示集合中元素等于 i 的个数
for (int x : a) {
cnt[x]++;
}
vector<int> dp(1e6 + 1, 1); // dp[i] 表示以 i 为倍数的子集数量
for (int i = 1e6; i >= 1; i--) {
vector<int> divs = divisors(i); // 求 i 的所有因子
for (int d : divs) {
dp[d] = (dp[d] + dp[i]) % MOD; // 更新以 d 为倍数的子集数量
}
}
int ans = 0;
for (int i = 1; i <= 1e6; i++) {
if (cnt[i] >= 2) { // 集合中元素等于 i 的个数大于等于 2
ans = (ans + dp[i] - 1 + MOD) % MOD; // 减去空集的情况
}
}
cout << ans << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/lJtT 著作权归作者所有。请勿转载和采集!