f128 : long double
i128 : __int128
i64 : long long
i32 : int
f128 calc(const i32& i, const i32& j) {
f128 res = 1;
i32 p = ::p;
for (f128 a = abs(s[i] - s[j] - 1 - l); p; p >>= 1, a = a * a) // ::p 就是把全局变量 p 复制进来,但是不修改全局的 p
if (p & 1) {
res *= a;
} // 快速幂,log(10)=3,算常数复杂度
return res + f[j];
}
i32 find(const d& x, const i32& i) {
i32 l = x.l, r = x.r;
while (l < r) {
i32 mid = (l + r) >> 1;
if (calc(mid, x.p) >= calc(mid, i))
r = mid;
else
l = mid + 1;
}
return r - 1;
}
void solve() {
cin >> n >> l >> p;
for (i32 i = 1; i <= n; ++i) {
cin >> poem[i];
s[i] = poem[i].size() + s[i - 1] + 1;
}
// DP 部分
std::deque<d> q;
q.emplace_front((d){ 1, n, 0 }); // 第一个可决策点就是 0
for (i32 i = 1; i <= n; ++i) {
if (!q.empty()) {
if (q.front().r == i - 1)
q.pop_front();
else
q.front().l = i; // 没用的决策扔掉
}
i32 j = q.front().p;
f[i] = calc(i, j);
nxt[j] = i; // 记录最佳决策点
while (!q.empty() && calc(q.back().l, q.back().p) >= calc(q.back().l, i)) {
q.pop_back();
}
if (!q.empty()) {
if (calc(q.back().r, q.back().p) <= calc(q.back().r, i))
q.emplace_back((d){ i, n, i });
else {
i32 pos = find(q.back(), i);
q.back().r = pos;
q.emplace_back((d){ pos + 1, n, i });
}
} else
q.emplace_back((d){ i + 1, n, i });
}
if (f[n] > 1e18) goto failed;
cout << (i64)f[n] << std::endl;
nxt[n] = n + 1;
// 还原答案
for (i32 i = 0; i <= n; i = nxt[i]) {
for (i32 j = i + 1; j <= nxt[i] && j <= n; ++j) {
cout << poem[j];
if (j != nxt[i]) cout.put(' ');
}
if (i != n) cout.put('\n');
}
return;
failed:
cout << "Too hard to arrange\n";
}