これ茶色はさすがにびっくりした!
問題概要
整数 が与えられる。
正の整数からなる数列 であって、
- が の約数であるような任意の に対して
という条件を満たすものを考える。そのような数列のうち、数列に登場する値の最大値が最小となるようなものを一つ求めよ。
考えたこと
たとえば のとき、1, 2, 4, 12, 24 というように、隣接する二要素が約数倍数関係であるようなものをとってくると、どの 2 つも約数倍数であるようになっている。
つまりこの場合、
というように、絶対に「5」までは必要になるのだ。
一般に、 以下の整数のうち、「素因数分解したときの指数の和の最大値 + 1」だけの値までは必ず必要になることが示せる。たとえば
なので、24 を含むなら 3 + 1 + 1 = 5 までは必ず必要というわけだ。
十分性
逆に、 以下の整数のうち、「素因数分解したときの指数の和の最大値 + 1」が答えとなるような数列を具体的に作ることもできる。
具体的には、各 に対して
- = を素因数分解したときの指数の和 + 1
としてあげれば、条件を満たすことになる!!!
が の約数であるとき、 を素因数分解したときの指数の和は、 を素因数分解したときの指数の和よりも真に小さいことからわかる。
コード
#include <bits/stdc++.h> using namespace std; int main() { auto calc = [&](long long n) -> long long { long long res = 1; if (n == 1) return res; for (long long p = 2; p * p <= n; ++p) { while (n % p == 0) { ++res; n /= p; } } if (n > 1) ++res; return res; }; int N; cin >> N; for (long long n = 1; n <= N; ++n) cout << calc(n) << " "; cout << endl; }