はまやんはまやんはまやん

hamayanhamayan's blog

ユーザーID [yukicoder No.537]

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;
}