题目链接:https://codeforc.es/contest/1831/problem/D

大意是给出两个长度为n的数组a和b,确定存在多少个i和j,使得ai*aj = bi+bj,ai和bi范围在n以内。

考虑根号分治。

不太好求解,但是数据范围是有限的,通过题意我们可以看出配对数量和顺序无关,直接根据ai进行排序。

从1暴力到根下2n的范围。通过确定每一个aj和bj,对于跟下范围的i,我们可以确定另一个bi。哈希记录一下即可。

code:

const int nn = 2e5+10;
ii a[nn];
int cnt[nn];
void solve()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i].fi;
	for(int i=1;i<=n;i++) cin>>a[i].se;
	sort(a+1,a+n+1);
	ll ans = 0;
	for(int i=1;i*i<=(n<<1);i++){
		mem(cnt);
		for(int j=1;j<=n;j++){
			int cal = a[j].fi*i-a[j].se;
			if(cal>=1&&cal<=n){
				ans+=cnt[cal];
			}
			if(a[j].fi==i) cnt[a[j].se]++;
		}
	}
	cout<<ans<<endl;
}