985因子对难题

提交: 19  解决: 8  统计

题目描述

985有 n  n个正整数,他想知道存在多少个合法的因子对 (a[i],a[j])  (a[i],a[j])满足:

a[j]%a[i]==0  a[j]%a[i]==0 && i!=j  i!=j && 1<=i,j<=n  1<=i,j<=n。其中 ij  i,j是元素的下标,从 1n  1−n

特别地,他认为 (a[i],a[j])  (a[i],a[j]) (a[j],a[i])  (a[j],a[i])是相同的。

输入

第一行输入一个整数 T  T,代表有 T  T组测试数据。
每组数据占两行,第一行输入一个 n  n代表元素个数,下面一行输入 n  n个整数 a[]  a[]
注: 1<=T<=301<=n<=10 5 1<=a[]<=10 6   1<=T<=30,1<=n<=105,1<=a[]<=106

输出

一个整数代表最后的答案。

样例输入

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

样例输出

5

10

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值