题目:http://acdream.info/problem?pid=1071
求(i,j)的对数,满足(a[i]>a[j] && a[i]%a[j]!=0).
排序后,对于j,>a[j]的区间肯定是(j,n]的子集,剔除这个区间a[j]的倍数,剩下的就是答案。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=100005;
int n,a[N],num[N],pos[N];
long long ans;
inline void In(){
memset(num,0,sizeof(num));
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
num[a[i]]++;
}
sort(a,a+n);
int i=0;
while(i<n){
int val=a[i];
while(i<n && a[i]==val) i++;
pos[val]=i-1;
}
ans=0;
for(int i=0;i<n;i++){
if(a[i]==1){
continue;
}
long long cnt=0;
for(int j=a[i]*2;j<=a[n-1];j+=a[i]){
cnt+=num[j]*1LL;
}
cnt=n-i-1-cnt-(pos[a[i]]-i);
ans+=cnt;
}
printf("%lld\n",ans);
}
int main(){
while(~scanf("%d",&n)){
In();
}
return 0;
}