を素数とします。そうすると、 に対して が成り立ちます。
もっと一般に、正整数 に対して の素因数分解をそれぞれ 、ただし は素数、 とすると、多重集合 と が一致していれば が言えます。
つまり、素因数の指数の多重集合によって、 の値が決定されるということです。以降は に対して、多重集合 を の Prime Signature ( https://en.wikipedia.org/wiki/Prime_signature )と呼ぶことにします。
以下の Prime Signature は何種類あるでしょうか? の場合、素因数の個数は 以下であるため、 以下の分割数の和で個数が評価できます。A000070 によると、 個程度です。しかし、実際はより少なく、次のようになります。
下の表の2べき版については https://oeis.org/A025488 にあります。
個数 | |
---|---|
5 | |
16 | |
39 | |
83 | |
160 | |
289 | |
492 | |
803 | |
1274 | |
1962 | |
2958 | |
4357 | |
6312 | |
8999 | |
12651 | |
17563 | |
24112 | |
32749 |
Prime Signature を列挙し、それぞれについて を求めることが比較的短時間で出来ます。
各 Prime Signature についてその の値が分かったとします。
この問題に答えるために、各 Prime Signature について 以下でその Prime Signature になるようなものの個数をすべて求めたいです。
まず、いわゆる Lucy DP によって各 に対して 以下の素数の個数を から 時間で求めます。
そこから、 Black Algorithm を応用した DFS を適用します。次の 頂点の木を考えます。
これを DFS しますが、葉であるような頂点は探索しないことにします。探索回数は次の表の通りになります。
探索回数 | ||
---|---|---|
10^1 | 4 | 0.60206 |
10^2 | 19 | 0.63938 |
10^3 | 88 | 0.64816 |
10^4 | 403 | 0.65133 |
10^5 | 1894 | 0.65548 |
10^6 | 9108 | 0.65990 |
10^7 | 44948 | 0.66467 |
10^8 | 228102 | 0.66977 |
10^9 | 1185818 | 0.67489 |
10^10 | 6298637 | 0.67992 |
10^11 | 34113193 | 0.68481 |
10^12 | 188014195 | 0.68952 |
10^13 | 1052806860 | 0.69403 |
10^14 | 5981038282 | 0.69834 |
10^15 | 34430179518 | 0.70246 |
10^16 | 200620098564 | 0.70640 |
10^17 | 1182177744973 | 0.71016 |
10^18 | 7039070737124 | 0.71375 |
よって、競プロで使う範囲の に対しては や と同じくらいと見積もることができます。ただし、実際は らしいです。(ABC370-G の解説)
ここで、葉でない頂点 について、そこからつながる 以外の葉はすべて Prime Signature が同じになっています。よって、各 以下の素数の個数を数え上げたことによって、 各 Prime Signature となる 以下の正整数の個数を探索回数の定数倍で求めることができます。
以上を実装することでこの問題に答えることができます。