【AMPPZ2014】【BZOJ4146】Divisors

来源:互联网 发布:知乎 欧猪四国是哪四国 编辑:程序博客网 时间:2024/06/07 01:46

Description
给定一个序列a[1],a[2],…,a[n]。求满足i!=j且a[i]|a[j]的二元组(i,j)的个数。

Input
第一行包含一个正整数n(1<=n<=2000000),表示序列长度。
第二行包含n个正整数,依次表示a[1],a[2],…,an。

Output
一个整数,即满足条件的二元组的个数。

Sample Input
5
2 4 5 2 6
Sample Output
6
HINT

满足条件的6组分别为(1,2),(1,4),(1,5),(4,1),(4,2),(4,5)。

Source

鸣谢Claris上传

计数器+枚举因子
调和级数复杂度
(但是我跑的好慢

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define MAXN 2000010#define LL long long#define GET (ch>='0'&&ch<='9')using namespace std;int n,maxn;int a[MAXN],c[MAXN],f[MAXN];LL ans;void in(int &x){    char ch=getchar();x=0;    while (!GET)    ch=getchar();    while (GET) x=x*10+ch-'0',ch=getchar();}int main(){    in(n);    for (int i=1;i<=n;i++)  in(a[i]),c[a[i]]++,maxn=max(maxn,a[i]);    for (int i=1;i<=maxn;i++)        for (int j=i;j<=maxn;j+=i)  f[j]+=c[i];    for (int i=1;i<=maxn;i++)   ans+=(LL)(c[i])*f[i];    ans-=n;cout<<ans<<endl;}
0 0