zzulioj 1902( 985的因子对难题)

来源:互联网 发布:python三本经典书籍 编辑:程序博客网 时间:2024/05/16 14:33

Description

985有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 Input

2
5
1 2 3 4 5
5
2 2 2 2 2

Sample Output

5
10

类似于素数筛选的方法打表,用数组a来记录每个数组出现的次数(下标法)

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int a[1000010]; int main(){    int i,j,t,n;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        int max=-1;        memset(a,0,sizeof(a));        for(i=0; i<n; i++)        {            int num;            scanf("%d",&num);            a[num]++;            if(num>max)                max=num;//记录数组a下标的最大值        }        int ans=0;        for(i=1; i<=max; i++)        {            if(a[i])                for(j=i*2; j<=max; j+=i)                    ans+=a[j]*a[i];//i是当前数,a[i]是当前数的额个数,j是i的倍数,a[j]是i的倍数的个数,相乘可得因子对数;            ans+=a[i]*(a[i]-1)/2;因为重复的数字互相也可以组成因子对,所以如果i有多个的话,需要将重复数字组成的因子对也算上;        }        printf("%d\n",ans);    }    return 0;}


0 0