cf-div.2-875d

链接:https://codeforces.com/contest/1831/problem/D

脑子确实不好使,没啥思路,看jls代码之后豁然开朗。

思路:先枚举约数s,因为bi+bj不会超过4e5,所以第一层枚举所有约数为根号级别,第二层循环里枚举所有对数,统计v=aisbi的所有个数,只有当ai的值与s的值相等时,才能去更新cnt[v]的值。

注意点:本题必须从小到大按ai排序,因为我们枚举的s为根号级别,只能用小的约数去找大的约数,不能反过来。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
pair<int,int> num[N];
int cnt[N];
void solve(){
	int n;
	cin>>n;
	for (int i=1;i<=n;i++) cin>>num[i].first;
	for (int i=1;i<=n;i++) cin>>num[i].second;
	sort(num+1,num+1+n);
	long long ans = 0;
	for (int s = 1 ; s*s <= 2*n ; s++){
		for (int i=1;i<=n;i++) cnt[i] = 0;
		for (int i=1;i<=n;i++){
			int v = s*num[i].first-num[i].second;
			if (v>=1&&v<=n) ans += cnt[v];
			if (num[i].first==s) cnt[num[i].second]++;
		}
	}
	cout<<ans<<'\n';
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T;
	T = 1;
	cin>>T;
	while(T--) solve();
	return 0;
}
posted @   安潇末痕  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示