记录编号 616239 评测结果 AAAAAAAAAA
题目名称 数列求和 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 13.557 s
提交时间 2026-06-02 20:30:55 内存使用 14.91 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
typedef long long ll;
ll C[N][N], s, a, k, val[N], bas[N], res[N];
int mod;
ll ksm(ll a, ll b) {
    a %= mod;
    ll ans = 1;
    while (b) {
        if (b & 1) {
            ans = (ans * a) % mod;
        }
        a = (a * a) % mod;
        b >>= 1;
    }
    return ans;
}
void solve(ll n) {
    if (n <= 2000) {
        for (int i = 1; i <= n; i++) {
            bas[i] = 1;
        }
        for (int i = 0; i <= k; i++) {
            ll prd = a;
            for (int j = 1; j <= n; j++) {
                (val[i] += bas[j] * prd % mod) %= mod;
                (bas[j] *= j) %= mod, (prd *= a) %= mod;
            }
        }
        return;
    } else {
        solve(n / 2);
        ll m = (n / 2) % mod;
        if (!(n & 1)) {
            ll P = ksm(a, n / 2);
            for (int i = 0; i <= k; i++) {
                ll prd = 1;
                for (int j = 0; j <= i; j++) {
                    res[i] += C[i][j] * prd % mod * val[i - j] % mod;
                    prd = (prd * m) % mod;
                }
                res[i] = (res[i] % mod * P % mod + val[i]) % mod;
            }
        } else {
            ll P = ksm(a, n / 2 + 1), Q = P;
            for (int i = 0; i <= k; i++) {
                ll prd = 1;
                for (int j = 0; j <= i; j++) {
                    res[i] += C[i][j] * prd % mod * val[i - j] % mod;
                    prd = (prd * (m + 1)) % mod;
                }
                res[i] = (res[i] % mod * P % mod + val[i]) % mod;
                res[i] = (res[i] + Q) % mod, Q = (Q * (m + 1)) % mod;
            }
        }
        for (int i = 0; i <= k; i++) {
            val[i] = res[i];
            res[i] = 0;
        }
    }
    return;
}
int main() {
    freopen("oeis.in", "r", stdin);
    freopen("oeis.out", "w", stdout);
    scanf("%lld %lld %lld %d", &s, &a, &k, &mod);
    for (int i = 0; i <= k; i++) {
        C[i][0] = C[i][i] = 1;
        for (int j = 1; j < i; j++) {
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
        }
    }
    solve(s);
    printf("%lld\n", val[k]);
    return 0;
}