BZOJ-4146: [AMPPZ2014]Divisors

[文章目录]

Description

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

由于ai<=2000000,先将每个数的个数都统计出来。然后对于每个数暴力统计答案。如果之前统计过了,直接拿来用。复杂度
感觉这个复杂度很有用的样子。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,a[2001000],num[2001000],ans[2001000];
bool v[2001000];
long long fna;
int work(int x)
{
    int re=0;
    for(int i=x;i<=2000000;i+=x)
        re+=num[i];
    return re;
}
int read()
{
    char ch=getchar();int re=0;
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9')
        re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
    return re;
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        num[a[i]]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(!v[a[i]])
        {
            v[a[i]]=1;
            ans[a[i]]=work(a[i]);
        }
        fna+=ans[a[i]];
    }
    printf("%lld\n",fna-n);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注