結果
| 問題 |
No.2369 Some Products
|
| コンテスト | |
| ユーザー |
shobonvip
|
| 提出日時 | 2023-06-30 00:36:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 863 bytes |
| コンパイル時間 | 4,186 ms |
| コンパイル使用メモリ | 253,524 KB |
| 最終ジャッジ日時 | 2025-02-15 03:11:06 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 1 TLE * 1 -- * 12 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
typedef modint998244353 mint;
typedef long long ll;
// DP によって O(N^2 Q)
// dp[i][j] : i-1 番目まで見た時 j 個使用するときの積の総和
// これ、おそらく非想定(実際に O(NQ log^2 N) が可能, Mo もいける?)だけど、
// 愚直ですごい間に合う気がする
int main(){
int n; cin >> n;
vector<mint> p(n);
for (int i=0; i<n; i++){
int t; cin >> t;
p[i] = t;
}
int q; cin >> q;
for (int i=0; i<q; i++){
int a, b, k; cin >> a >> b >> k;
a--;
vector<mint> dp(k+1);
dp[0] = 1;
for (int j=a; j<b; j++){
vector<mint> ndp(k+1);
for (int l=0; l<=k; l++){
ndp[l] += dp[l];
}
for (int l=1; l<=k; l++){
ndp[l] += dp[l-1] * p[j];
}
dp = ndp;
}
cout << dp[k].val() << "\n";
}
}
shobonvip