2017年8月7日提高组T1 呵呵

本文介绍了一种算法,用于解决给定序列中寻找特定因数对的问题。具体目标是计算序列中有多少个不同的二元组(i,j),使得a[i]是a[j]的因数。文章提供了一个示例输入和输出,并详细解释了算法思路及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

这天,小A得到了一个序列a[1],a[2]…a[n],他想知道有多少个二元组(i,j)满足i!=j且a[i]是a[j]的因数。

Input

第一行有一个正整数n,第二行包含n个整数。

Output

输出一行,表示满足条件的二元组个数。

Sample Input

5
2 4 5 2 6

Sample Output

6

Hint

对于前30%的数据,n,k<=1000.
对于100%的数据,n<=2000000,a[i]<=2000000。

分析:
其实就很简单。我们对于每个数i,如果对答案有贡献,则序列中存在n*i。由于与序列顺序无关,对于每个i都有相同的对数,我们只要求出其中一个数与后面的数有多少个数可以成对,在乘一下就好。把数据可以存在一个桶中。

代码:

var
 n,x,e:longint;
 t,ans:longint;
 a:array [1..4000001] of longint;
 i,j:longint;
begin
 readln(e);
 for i:=1 to e do
  begin
   read(x);
   if x=0 then continue;
   inc(a[x]);
   if x>n then n:=x;
  end;
 for i:=1 to n do
  begin
   if a[i]=0 then continue;
   j:=i; t:=0;
   while j<=n do
    begin
     t:=t+a[j];
     j:=j+i;
    end;
   ans:=ans+(t-1)*a[i];
  end;
 writeln(ans);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值