题意
思路
设,则
分别设,
则 均为 的的因数,且 ,可枚举每一个 的因数,确定 的值,若暴力枚举,复杂度 ,会T;因为对于每一个数 x,我们枚举了 每一个数,但其中有很多不是 x 的因数,怎样才能只枚举因数,而不枚举其他数;
我们对于每一个因数 x,枚举其能够作为谁的因数,答案显然是 x 的倍数都可以,至此问题转变成了枚举每一个数的倍数,再思考一下枚举倍数的过程,埃氏筛!!!事先保存每一个数出现的次数,通过埃氏筛枚举倍数,复杂度
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1000010], tong[1000010];
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i]; tong[a[i]]++;
}
ll ans = 0;
for(int i = 1; i <= 1000000; i++){
for(int j = i; j <= 1000000; j += i){
int mx = max(j / i, i), mn = min(j / i, i); //表示两个因子
int tmp = mx - mn;
if(tmp % 2) continue; //判断是否存在这样的ai
ans += 1ll * tong[j] * tong[tmp / 2]; //j表示aj,tmp / 2表示ai
}
}
cout << ans / 2 << "\n"; //一对因子会计算两次,如2*5=10,5*2=10
return 0;
}