🟫
ABC292-C: Four Variables 解説
問題
正整数
が与えられるので, N を満たす AB + CD = N の組の個数を出力してください (A,B,C,D)
制約
2 \leq N \leq 2 \times 10^5
答えは以下であることが保証される 9 \times 10^{18}
コンテスト中に考えたこと
- 計算量的に
が通らないO(N^2) -
を満たすAB=N の組の総数は(A,B) で求められるのでこれを使えば良さそうO(\sqrt(N)) -
かAB かのどちらかが決まれば両方決まるので,片方をCD 以上1 以下で探索すると良さそうN
解説
-
を固定すると,AB となるCD = N - AB - 積が
となるペアの総数を求める関数をN とすると,答えはf(N) \sum_{i=1}^{N-1}{f(i) \times f(N - i)} - 関数
は積がf(N) になるペアのうち,少なくとも一方はN 以下であることを用いることで\sqrt N で動作するO(\sqrt N) - そのため全体として
で解くことができるO(N\sqrt N)
コード
#include<bits/stdc++.h>
using ll = long long;
using namespace std;
ll countProductPairs(ll N){
ll res = 0;
for(ll i = 1; i * i <= N; ++i){
if(N % i == 0){
if(i * i == N) res += 1;
else res += 2; // (A,B) = (i, N/i), (N/i, i)
}
}
return res;
}
int main(){
int N;
cin >> N;
ll ans = 0;
for(ll i = 1; i < N; ++i){
ans += countProductPairs(i) * countProductPairs(N - i);
}
cout << ans << endl;
}
Discussion