题目大意:给定两个整数数组a,b,数组长度<=n。求使得a[i]*a[j]==b[i]+b[j]成立的无序对(i,j)总共有多少对。两个数组元素的取值范围为1<=a<=n,1<=b<=n(a,b代表数组中的元素)。
思路:由于1<=a[i]<=n,1<=b[j]<=n,a[i]*a[j]==b[i]+b[j],可得b[i]+b[j]<=2*n,可得a[i]*b[j]<=2*n。
1、创建整数对并从小到大排序(为了方便描述,作者将整数对数组pa[i].first描述成a[i],pa[i].second描述成b[i]),然后枚举x:1~作为a[i]。
2、枚举j:1~n。
3、此时可以求得b[i],若1<=b[i]<=n,那么最终答案加上a[i]=x情况下,与a[i]对应的b[i]值的个数mp[b[i]]。
如果此时的a[j]==x,mp[b[i]]++(这一步的目的是为了使得枚举的j只能与小于j的i匹配,避免因顺序原因重复贡献)。
4、输出答案。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=2e5+100;
int a[MAXN];
int b[MAXN];
pair<int,int> pa[MAXN];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;cin>>t;
while(t--)
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
for(int i=1;i<=n;i++)
{
pa[i]=make_pair(a[i],b[i]);
}
int num=0;
sort(pa+1,pa+1+n,less<pair<int,int>>());
int ans=0;
for(int x=1;x*x<=2*n;x++)
{
vector<int>mp(n+10);
for(int j=1;j<=n;j++)
{
int bi=x*pa[j].first-pa[j].second;
if(bi>=1&&bi<=n)
{
ans+=mp[bi];
}
if(pa[j].first==x)
{
mp[pa[j].second]++;
}
}
}
cout<<ans<<"\n";
}
return 0;
}