The BOSS Can Count Pairs
题意:
给定两个数组a和b,长度均为n。
要求找到【i,j】的对数,使得1<=i<j<=n&&a[i]*a[j]==b[i]+b[j]。
思路:
对于每个a[i]记录与它对应的b[i]。然后枚举a[i],用f数组记录每个选择的贡献,先求相同a[i]对应的b[i]的贡献,再求不同的贡献,注意每个循环最后f数组的处理。
代码:
int n, a[maxn], b[maxn], f[maxn];
vector<int> v[maxn];
void solve() {
cin >> n;
for (int i = 1; i <= n * 2; i++) v[i].clear();
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i], v[a[i]].push_back(b[i]);
int ans = 0;
for (int x = 1; x * x <= 2 * n; x++) {
for (auto j : v[x]) {
ans += x * x - j > 0 ? f[x * x - j] : 0;
f[j] ++;
}
for (int y = x + 1; x * y <= 2 * n; y++)
for(auto j : v[y])
ans += x * y - j > 0 ? f[x * y - j] : 0;
for (auto j : v[x]) f[j] --;
}
cout << ans << endl;
}