题意:给定一个序列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 }