Submission #64315168


Source Code Expand

Copy
#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
const ll MOD = 998244353;
// mod
ll modexp(ll a, ll b, ll mod=MOD) {
ll res = 1 % mod;
a %= mod;
while(b){
if(b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <iostream>
#include <vector>
using namespace std;
 
using ll = long long;
const ll MOD = 998244353;
 
// 繰り返し二乗法による高速な mod 累乗
ll modexp(ll a, ll b, ll mod=MOD) {
    ll res = 1 % mod;
    a %= mod;
    while(b){
        if(b & 1) res = (res * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int N, K;
    cin >> N >> K;
    vector<ll> A(N);
    for (int i = 0; i < N; i++){
        cin >> A[i];
    }
    
    // P[i] = A[0] + A[1] + ... + A[i-1] (P[0]=0)
    vector<ll> P(N+1, 0);
    for (int i = 0; i < N; i++){
        P[i+1] = P[i] + A[i];
    }
    
    // powP[m][i] = (P[i])^m mod MOD を precompute
    // m=0~K, i=0~N
    vector<vector<ll>> powP(K+1, vector<ll>(N+1, 0));
    for (int i = 0; i <= N; i++){
        powP[0][i] = 1; // 定義より P[i]^0 = 1
    }
    for (int m = 1; m <= K; m++){
        for (int i = 0; i <= N; i++){
            ll x = P[i] % MOD;
            powP[m][i] = (powP[m-1][i] * x) % MOD;
        }
    }
    
    // 累積和 cum[m][j] = sum_{i=0}^{j-1} powP[m][i] を precompute
    //  j = 1,...,N+1 としておく(cum[m][0] = 0)
    vector<vector<ll>> cum(K+1, vector<ll>(N+2, 0));
    for (int m = 0; m <= K; m++){
        cum[m][0] = 0;
        for (int j = 1; j <= N+1; j++){
            cum[m][j] = (cum[m][j-1] + powP[m][j-1]) % MOD;
        }
    }
    
    // (P[j]-P[i])^K を二項展開すると、
    //   (P[j]-P[i])^K = sum_{m=0}^{K} (-1)^m * binom(K, m) * P[j]^(K-m) * P[i]^m
    // よって全体の和は
    //   ans = sum_{m=0}^{K} (-1)^m * binom(K, m) * sum_{j=1}^{N} [ P[j]^(K-m) * (sum_{i=0}^{j-1} P[i]^m ) ]
    // として計算可能.
    
    // binom[m] = binom(K, m) を計算 (K ≤ 10 なので簡単な方法で)
    vector<ll> binom(K+1, 0);
    binom[0] = 1;
    for (int m = 1; m <= K; m++){
        binom[m] = (binom[m-1] * (K - m + 1)) % MOD;
        ll inv = modexp(m, MOD-2, MOD);
        binom[m] = (binom[m] * inv) % MOD;
    }
    
    ll ans = 0;
    // m = 0 ... K について和をとる
    for (int m = 0; m <= K; m++){
        // (-1)^m * binom(K, m)
        ll coeff = (m % 2 == 0 ? binom[m] : (MOD - binom[m]) % MOD);
        ll sum_j = 0;
        // j = 1 ... N について
        // P[j]^(K-m) は powP[K-m][j],また i の和は cum[m][j] により求められる
        for (int j = 1; j <= N; j++){
            sum_j = (sum_j + (powP[K-m][j] * cum[m][j]) % MOD) % MOD;
        }
        ans = (ans + coeff * sum_j) % MOD;
    }
    cout << ans % MOD << "\n";
    return 0;
}

Submission Info

Submission Time
Task F - Range Power Sum
User po1
Language C++ 20 (gcc 12.2)
Score 550
Code Size 2727 Byte
Status AC
Exec Time 46 ms
Memory 42404 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 550 / 550
Status
AC × 3
AC × 44
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 02_random2_00.txt, 02_random2_01.txt, 02_random2_02.txt, 03_minmax_00.txt, 03_minmax_01.txt, 03_minmax_02.txt, 03_minmax_03.txt, 03_minmax_04.txt, 03_minmax_05.txt, 03_minmax_06.txt, 03_minmax_07.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3488 KiB
00_sample_01.txt AC 1 ms 3440 KiB
00_sample_02.txt AC 1 ms 3500 KiB
01_random_00.txt AC 1 ms 4000 KiB
01_random_01.txt AC 19 ms 13996 KiB
01_random_02.txt AC 19 ms 13884 KiB
01_random_03.txt AC 16 ms 13484 KiB
01_random_04.txt AC 22 ms 17080 KiB
01_random_05.txt AC 22 ms 17080 KiB
01_random_06.txt AC 17 ms 14888 KiB
01_random_07.txt AC 25 ms 20296 KiB
01_random_08.txt AC 24 ms 20216 KiB
01_random_09.txt AC 18 ms 16588 KiB
01_random_10.txt AC 27 ms 23512 KiB
01_random_11.txt AC 27 ms 23460 KiB
01_random_12.txt AC 4 ms 6108 KiB
01_random_13.txt AC 31 ms 26500 KiB
01_random_14.txt AC 30 ms 26516 KiB
01_random_15.txt AC 16 ms 15580 KiB
01_random_16.txt AC 33 ms 29744 KiB
01_random_17.txt AC 34 ms 29612 KiB
01_random_18.txt AC 20 ms 19572 KiB
01_random_19.txt AC 36 ms 32956 KiB
01_random_20.txt AC 37 ms 32812 KiB
01_random_21.txt AC 20 ms 19372 KiB
01_random_22.txt AC 39 ms 36012 KiB
01_random_23.txt AC 40 ms 36108 KiB
01_random_24.txt AC 4 ms 6184 KiB
01_random_25.txt AC 43 ms 39268 KiB
01_random_26.txt AC 42 ms 39124 KiB
01_random_27.txt AC 32 ms 30172 KiB
01_random_28.txt AC 45 ms 42308 KiB
01_random_29.txt AC 46 ms 42312 KiB
02_random2_00.txt AC 45 ms 42280 KiB
02_random2_01.txt AC 45 ms 42276 KiB
02_random2_02.txt AC 45 ms 42404 KiB
03_minmax_00.txt AC 1 ms 3404 KiB
03_minmax_01.txt AC 1 ms 3576 KiB
03_minmax_02.txt AC 1 ms 3508 KiB
03_minmax_03.txt AC 1 ms 3400 KiB
03_minmax_04.txt AC 15 ms 13912 KiB
03_minmax_05.txt AC 19 ms 13892 KiB
03_minmax_06.txt AC 40 ms 42240 KiB
03_minmax_07.txt AC 45 ms 42228 KiB


2025-07-02 (Wed)
22:50:10 +09:00