SRM628D1Easy DivisorsPower

ちょっと苦手

問題概要(原文)

$f(x) = x^h(x)$ とする.ここで $h(x)$ は $x$ の約数の数に等しい.

$f(x) = N$ を満たす $x$ であって最小の値を求めよ.

考察

$1$ は特殊ケースだが,あまり考えなくてもよいようになっている.

約数の数は $2$ 以上であるので,答えは少なくとも $\sqrt{N}$ 以下であることがわかる.

約数の数が $2$ 個となるケース $N=p^2$ となる場合であるので,そのような $p$ は二分探索で求められる.

約数の数が $3$ 個となるケースは $N=( p^{2} )^3$ となる場合だけであるので, $10^{6}$ 以下の整数全てについて調べればよい.

計算量は $\sum_{i = 1}^{M} d(i)$ ステップ程度の計算量で済む.

ソースコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Debug = System.Diagnostics.Debug;
using StringBuilder = System.Text.StringBuilder;
public class DivisorsPower
{
    public long findArgument(long n)
    {

        var a = new int[1000050];
        for (int i = 1; i < 1000050; i++)
        {
            for (int j = i; j < 1000050; j += i)
                a[j] += 1;
        }
        for (int i = 1; i < 1000050; i++)
        {
            var k = a[i];
            var v = n;
            for (int j = 0; j < k; j++)
                if (v % i == 0) v /= i;
                else { v = -1; break; }
            if (v == 1) return i;

        }

        long l = 1, r = 1000000001;
        for (int i = 0; i < 50; i++)
        {
            var m = (l + r) / 2;
            if (m * m >= n) r = m;
            else l = m;
        }

        if (r * r == n)
        {
            for (long i = 2; i * i <= r; i++)
                if (r % i == 0) r = -1;

            if (r != -1) return r;
        }
        return -1;
    }
}

コメント

  • medより難しい