题目描述
现在给定两个长度为几的正整数序列 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 aj∗bi 得 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);
}