これは手計算でできる問題です。べき乗の計算をしてはいけません。
function gcd($n, $m) { if($m -eq 0) { $n } else { gcd $m ($n % $m) } } function int_log($n, $b) { $e = 0 $p = 1 while($p -le $n) { $e += 1 $p *= $b } $e - 1 } # 指数ごとにべき乗数の個数を求める # $N = 10ならべき乗数は2^2, 2^3, 3^2だから # 2乗は2個、3乗は1個 # @(0, 0, 2, 1)となる function num_powers($N) { $pows = @{ } # べき乗数の集合 for($b = 2; $b * $b * $b * $b -le $N; ++$b) { for($p = $b * $b; $p * $p -le $N; $p *= $b) { $pows[$p] = 1 } } $a = @() # 各底で最大の指数 for($b = 2; ; ++$b) { if($pows[$b] -ne $null) { continue } $emax = int_log $N $b if($emax -eq 1) { break } $a += $emax } $b = @(0) * ($a[0] + 1) foreach($emax in $a) { foreach($e in 2..$emax) { $b[$e] += 1 } } $b } # 指数$eが与えられたとき、 # 2^$eの$N乗までの数でより大きなべき乗で表せるものの個数を返す function overlap($e, $N) { $a = @(0) * ($N + 1) foreach($e1 in 1..($e-1)) { $d = $e1 / (gcd $e1 $e) if($d -eq 1) { $k0 = 2 } else { $k0 = $d } for($k = $k0; $k * $e -le $N * $e1; $k += $d) { $a[$k] = 1 # 表せる } } ($a | measure -sum).sum } $N = 100 $nes = num_powers $N $overlaps = (2..($nes.length - 1) | foreach { (overlap $_ $N) * $nes[$_] } | measure -sum).sum ($N - 1) * ($N - 1) - $overlaps