bzoj4146 [AMPPZ2014]Divisors

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

O(nlogn)是可以过的。。。

因为sigma(1/i)=O(logn) {1<=i<=n}

所以sigma(n/i)=O(nlogn)

所以去个重之后就可以暴力...

 1 #include<bits/stdc++.h>
 2 #define rep(i,l,r) for(int i=l;i<=r;++i)
 3 using namespace std;
 4 const int N=2023333;
 5 int n,a[N],s[N],cnt,num[N];
 6 long long ans;
 7 int main(){
 8     scanf("%d",&n);
 9     rep(i,1,n) scanf("%d",&a[i]);
10     sort(a+1,a+1+n);
11     rep(i,1,n) num[a[i]]++;
12     rep(i,1,n) if(a[i]!=a[i-1]) s[++cnt]=a[i];
13     rep(i,1,cnt) ans+=1LL*num[s[i]]*(num[s[i]]-1);
14     rep(i,1,cnt) for(int j=s[i]*2;j<=s[cnt];j+=s[i]) ans+=1LL*num[j]*num[s[i]];
15     printf("%lld
",ans);
16 }
View Code
原文地址:https://www.cnblogs.com/Bloodline/p/5977113.html