1 条题解

  • 0
    @ 2026-10-27 13:20:34

    思路与算法

    先比较b−a和c−b。相同则第k项为a+(k−1)(b−a);否则由整数公比q=b/a得第k项a·q^(k−1),用二进制快速幂对200907取模。

    正确性说明

    等差列由首项与公差唯一确定;否则按承诺是整数公比等比列,b/a即公比。快速幂维护当前幂与已选二进制位的乘积,每轮平方并处理一位,最终得到正确模幂;模乘保持最终余数。两类均成立时是常数列,先判等差不影响结果。

    复杂度

    每组等差O(1),等比O(log k),空间O(1);T组总O(T log(max k))。

    易错点

    k从1计,指数k−1。只有明确的整数公比才能直接b/a;模200907不要求是素数,快速幂不依赖素性。中间乘法用64位。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    const ll MOD = 200907;
    ll power(ll a, ll b) {
        ll r = 1;
        for (a %= MOD; b; b >>= 1, a = a * a % MOD)
            if (b & 1)
                r = r * a % MOD;
        return r;
    }
    int main() {
        int T;
        cin >> T;
        while (T--) {
            ll a, b, c, k;
            cin >> a >> b >> c >> k;
            if (b - a == c - b)
                cout << (a % MOD + (k - 1) % MOD * ((b - a) % MOD)) % MOD << '\n';
            else
                cout << a % MOD * power(b / a, k - 1) % MOD << '\n';
        }
    }
    
    • 1

    信息

    ID
    2100
    时间
    1000ms
    内存
    512MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者