APIO2022 perm Sol
呃为什么没有我这种做法。
考虑两个序列
对于
对于
大质数就寄了。所以
不会算复杂度,但是跑的飞快,随了几个数答案也在
int dec(int n) {
int B = min(n - 1, (int)sqrt(n) * 4), cur = 1;
vector<int> d;
while (n > 1) {
int x = pr(n);
d.push_back(x);
n /= x;
}
if (n > 1) d.push_back(n);
for (int i : d) if (i * cur <= B) cur *= i;
return cur;
}
vector<int> f(int k) {
if (k <= 100) return bk[k];
vector<int> ans;
if (mr(k)) {
ans = f(k - 1);
for (int &i : ans) ++i;
ans.push_back(0);
} else {
int p = dec(k);
ans = f(k / p);
int x = ans.size();
vector<int> r = f(p);
for (int i : r) ans.push_back(i + x);
}
return ans;
}