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)
posted @ 2025-08-07 20:44  kodil  阅读(18)  评论(0)    收藏  举报