【SSLGZ 2667】2017年8月7日提高组T1 呵呵

来源:互联网 发布:哈萨克帅哥知乎 编辑:程序博客网 时间:2024/06/05 03:12

问题描述
这天,小A得到了一个序列a[1],a[2]…a[n],他想知道有多少个二元组(i,j)满足i!=j且a[i]是a[j]的因数。
输入
第一行有一个正整数n,第二行包含n个整数。
输出
输出一行,表示满足条件的二元组个数。
样例输入
5
2 4 5 2 6
样例输出
6
算法讨论
枚举每一个数,将它按它的因子翻倍,若倍数在序列中则加一。

#include<cstdio>#include<cstring>using namespace std;int a[2000001],b[2000001],f[2000001];int n,s,max=0;int main(){    //freopen("hehe.in","r",stdin);    //freopen("hehe.out","w",stdout);    scanf("%d",&n);    memset(f,0,sizeof(f));    for (int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        f[a[i]]+=1;        if (a[i]>max)            max=a[i];    }    for (int i=1;i<=n;i++)    {        if (a[i]==0)            continue;        int r=0;        r=max / a[i];        s+=f[a[i]]-1;        for (int j=2;j<=r;j++)            if (f[a[i] * j]!=0)                s+=f[a[i] * j];    }    printf("%d",s);    fclose(stdin); fclose(stdout);    return 0;}

这里写图片描述
Pixiv ID:37738689