ZZULI 1902: 985的因子对难题

来源:互联网 发布:实用数据再分析法 pdf 编辑:程序博客网 时间:2024/05/17 20:54
1902: 985的因子对难题Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 156  Solved: 45SubmitStatusWeb BoardDescription985有n个正整数,他想知道存在多少个不同的因子对(a[i], a[j])使得1 <= i, j <= n && i != j && a[j] % a[i] == 0,其中i和j是元素的下标。特别地,他认为(a[i],a[j])与(a[j],a[i])是一样的因子对。Input第一行输入一个整数t,代表有t组测试数据。每组数据占两行,第一行输入一个n代表元素个数,下面一行输入n个整数a[]。注:1 <= t <= 30,1 <= n <= 1e5,1 <= a[] <= 1e6。Output一个整数代表最后的答案。Sample Input251 2 3 4 552 2 2 2 2Sample Output510HINTSourcehpuSubmitStatusWeb Board很简单记录下每个a[i]出现的次数然后对a[i]排序去重最后类似于筛素数的方法筛选出来就好了
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <stack>using namespace std;const int MAXN=1e5+10;int a[MAXN];int num[MAXN*10];int main(){    int T; scanf("%d",&T);    while(T--){        int n; scanf("%d" ,&n);        memset(num,0,sizeof(num));        for(int i = 1; i  <= n; i++ ){            scanf("%d",&a[i]);            num[a[i]]++;        }        sort(a + 1, a + n + 1);        int k=unique(a+1,a+1+n)-a;//去重函数        int sum=0;        k--;//        printf("%d~~~~\n",k);        for(int i=1;i<=k;i++){            sum=sum+(num[a[i]]-1)*(num[a[i]])/2;            for(int j=a[i]*2;j<=a[k];j+=a[i]){                    sum+=num[a[i]]*num[j];            }        }        printf("%d\n",sum);    }    return 0;}
0 0