Description
这天,小A得到了一个序列a[1],a[2]…a[n],他想知道有多少个二元组(i,j)满足i!=j且a[i]是a[j]的因数。
Input
第一行有一个正整数n,第二行包含n个整数。
Output
输出一行,表示满足条件的二元组个数。
Sample Input
5
2 4 5 2 6
Sample Output
6
Hint
对于前30%的数据,n,k<=1000.
对于100%的数据,n<=2000000,a[i]<=2000000。
做法;考虑到跟顺序无关,可以把所有数扔到桶里面,然后对于每一个数,先用组合数统计其本身的贡献,然后暴力查找它的所有倍数即可。因为根据调和级数1/1+1/2+1/3+…+1/n=ln(n)+c,c为欧拉常数,约等于0.5,所以不会超时。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int f[8000007],n,biggest,ans;
int main()
{
//freopen("hehe.in","r",stdin);
//freopen("hehe.out","w",stdout);
scanf("%d",&n);
int x;
biggest=0;
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
if (x<=0) continue;
f[x]++;
if (x>biggest) biggest=x;
}
for (int i=1;i<=biggest;i++)
if (f[i]>1) ans+=f[i]*f[i]-f[i];
for (int i=1;i<=biggest/2;i++)
if (f[i]!=0)
{
int j=i,k=i;
while (k<=biggest)
{
k+=j;
if (f[k]!=0) ans+=f[k]*f[i];
}
}
printf("%d",ans);
//fclose(stdin);
//fclose(stdout);
}