链接:
https://codeforces.com/problemset/problem/1541/B
题意:
共n组案例,每组案例中,先是一个数字n(2≤n≤1052≤n≤105),然后再n个不同的正整数ai(1≤ai≤2⋅n1≤ai≤2⋅n)。
题目要求找一对整数,满足 i<j 且 ai⋅aj=i+j.这个条件的对子数量。
input
3 2 3 1 3 6 1 5 5 3 1 5 9 2
output
1 1 3
本题的数据量不能直接开双重循环,我们可以开一重循环去找一个数字i的所有因数a,如果a*i<=2*n-1,即超过了最大值,就退出循环,如此,可以降低很多时间复杂度。
代码如下:
#include<iostream>
#include<unordered_map>
using namespace std;
typedef long long ll;
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
unordered_map<int, int>mp;//value index
int cnt = 0;//记录符合条件的数量
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
mp[x] = i;
}
for (auto i : mp) {
for (int a = 1; a * i.first <= 2 * n - 1; a++) {//找它所有的因数a
if (a == i.first) continue;//如果因数a等于它自己,就continue
if (mp.count(a) && mp[a] + i.second == a * i.first&&i.second<mp[a]) {//如果能找到该因数,且满足题目给的条件,cnt++
cnt++;
}
}
}
cout << cnt;
cout << endl;
}
return 0;
}