这道题感觉题面有点不太懂,可能是我阅读理解不行。这道题的每个元素是可以重复选择的,并且可以重复出现。比如n=1,输入为1,那么1 1 1是算一种情况的。
//标程
#include <bits/stdc++.h>
using namespace std;
constexpr int MAX = 200000;
int main() {
int n;
cin >> n;
vector<int> c(MAX + 1);
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
c[x] += 1;//记录x出现的次数
}
long long ans = 0;
for (int q = 1; q <= MAX; ++q) {
for (int r = 1; q * r <= MAX; ++r) {
ans += (long long)c[q] * c[r] * c[q * r];
//此处就是运用了排列组合的思想,c[q]里选1个,以此类推,总共的可能情况有
//c[q] * c[r] * c[q * r]
}
}
cout << ans << '\n';
return 0;
}
举例说明
当n=3,输入为1 2 2时,当q=1,即枚举第一位只选1的情况,而r=1,则是枚举第二位也只选1的情况,那么除数和商都是1,那么除数就是1,那就再枚举第三位是1的情况,那加起来就是排列组合的总值。