https://yukicoder.me/problems/no/537
前提知識
- O(sqrt(N))で約数列挙する方法
解説
https://yukicoder.me/submissions/185295
ある数Nの約数列挙はO(sqrt(N))で行える。
これを使って、約数の配列を用意する。
後は、to_stringあたりで積がNとなる2つの数を文字列にしてくっつけてsetで数える。
下手に賢くやると、特異なケースで落ちるので、setで適当にやるとよい。
typedef long long ll; vector<ll> enumdiv(ll n) { vector<ll> S; for (ll i = 1; i*i <= n; i++) if (n%i == 0) { S.push_back(i); if (i*i != n) S.push_back(n / i); } sort(S.begin(), S.end()); return S; } ll N; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N; auto ed = enumdiv(N); set<string> ans; for (ll i : ed) { ans.insert(to_string(i) + to_string(N / i)); } cout << ans.size() << endl; }