ACdream1071-神奇的%系列一

神奇的%系列一

Time Limit: 6000/3000MS (Java/Others)  Memory Limit: 65536/32768KB (Java/Others)
Submit  Statistic  Next Problem

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 != ja[i] > a[j]),使得 a[i] % a[j] != 0

Input

输入有多组数据。(<= 30)

对于每组数据:

第一行: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

admin
#include 
#include 
#include 
#include 
#include 

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(k0)
    {
        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;
}

你可能感兴趣的:(ACdream,----树状数组)