题解 - 数对的个数

题目描述

现在给定两个长度为几的正整数序列 a1,a2,···,an,b,b2,···,bn
问存在多少对数对(i,j),1 ≤i<j≤n满足& =号
输入格式
输入第一行,一个正整数n,表示序列的长度。
接下来几 行,每行两个正整数 ai,bi。
输出格式
单个整数:表示表示满足题意的数对的个数。
数据范围
对于 50% 的数据,1 ≤n< 1000
对于 100% 的数据,1 ≤n< 1,000,000,1 ≤ ai,bi < 1000
样例数据
输入:
3
45
3 8
10 2
输出:
1

分析

知识点:桶排序

解题思路:

等式两边同乘上 a j ∗ b i a_j*b_i ajbi a i b i = a j b j a_ib_i=a_jb_j aibi=ajbj ,此时 i , j i,j i,j 两式分开且互不影响,用 c w c_w cw 统计 a i b i = w a_ib_i=w aibi=w 的位置的个数,从前往后扫,每次先 a n s + = c w ans+=c_w ans+=cw c w + + c_w++ cw++

复杂度 O ( n ) O(n) O(n)

代码

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define LL long long 
using namespace std;
int const N=1e6+10,mo=1e9+7;
int n;
LL T,t[N],ans,s;
int main(){
	scanf("%d",&n); int x,y;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&x,&y);
		ans+=t[x*y];
		t[x*y]++;
	}
	printf("%lld",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值