神奇的%系列一
Time Limit: 6000/3000MS (Java/Others)
Memory Limit: 65536/32768KB (Java/Others)
Problem Description
在计算机的世界里,%不是百分比,而是除法取余哟!
比如:
4 % 2 = 0
5 % 3 = 2
给你 2 ≤ N ≤ 100000 个数,a[1],a[2]...a[i]...a[n] (1 ≤ a[i] ≤ 100000)。
问有几个组合 (a[i], a[j]),(i != j, a[i] > a[j]),使得 a[i] % a[j] != 0。
Input
输入有多组数据。(<= 30)
对于每组数据:
第一行:N(表示 N 个数)
第二行:N 个元素 a[i]
Output
输出有几个组合 (a[i],a[j]),使得 a[i] % a[j] != 0
Sample Input
3 1 1 1 4 1 2 3 4 5 1 2 2 4 6
Sample Output
0 2 1
Source
zju_xxx
Manager
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
const int maxn=100009;
int x[maxn];
int tree[maxn];
int a[maxn];
int lowbit(int k)
{
return k&(-k);
}
void add(int k)
{
while(k<maxn)
{
tree[k]++;
k+=lowbit(k);
}
}
int getsum(int k)
{
int sum=0;
while(k>0)
{
sum+=tree[k];
k-=lowbit(k);
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(x,0,sizeof x);
memset(tree,0,sizeof tree);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
x[a[i]]++;
add(a[i]);
}
ll ans=0;
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=2*a[i];j<=100000;j+=a[i])
cnt+=x[j];
ans+=(n-getsum(a[i]))-cnt;
}
printf("%lld\n",ans);
}
return 0;
}