2025-8-1
2025-8-1
Codeforces Round 519 by Botan Investments
题意描述
给定序列\(a_n\)(默认\(a_0\)=0),已知\(1 \le i \le n\), \(a_i = x_{(i-1)\bmod k} + a_{i-1}\)
要求还原序列, 输出序列x长度可能值,及数量。
思路分析
根据公式求差分数组,枚举长度可能值,验证可覆盖全序列a即可
即求查分数组的不严格周期(最后一组可能不全)
解题代码
void solve()
{
int n;
cin >> n;
vector<int> a(n);
for(int i = 0; i < n; ++i)cin >> a[i];
auto na = a;
for(int i = 1; i < n; i++) a[i] -= na[i-1];
vector<int> ans;
for(int k = 1; k <= n; k++){
bool find = 1;
for(int i = 0; i < n; i++){
int p = i % k;
if(a[p] != a[i])find = 0;
}
if(find)ans.push_back(k);
}
cout << lth(ans) << nl;
for(auto x : ans) cout << x << ' ';
cout << nl;
}
- 时间复杂度o(\(n^2\))
代码源round23-c
题意描述
给定x, y, 保证\(x \times y \ne 1\), 求\(a ^ b = x \times y\), 求b的最大值
思路分析
直接枚举a数据范围过大, 注意到\(x \times y\)在\(2^{64}\)以内枚举b, 找对应的a。
验证更新答案。
解题代码
void solve()
{
ll X, Y;
cin >> X >> Y;
ll t = X * Y;
ll xa = t;
int xb = 1;
for (int b = 64; b >= 2; --b) {
ll a = pow(t, 1.0 / b);
for (ll base = max(1LL, a - 2); base <= a + 2; ++base) {
__int128 test = 1;
for (int i = 0; i < b && test <= t; ++i)
test *= base;
if (test == t) {
xa = base;
xb = b;
break;
}
}
if (xb > 1) break;
}
cout << xa << ' ' << xb << nl;
}
- 时间复杂度o(1)

浙公网安备 33010602011771号