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);
#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 |
|
|
| 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 |