题目链接: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; }