結果
| 問題 |
No.1239 Multiplication -2
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-11-30 10:52:49 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 41 ms / 2,000 ms |
| コード長 | 1,300 bytes |
| コンパイル時間 | 2,525 ms |
| コンパイル使用メモリ | 187,736 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-13 02:19:30 |
| 合計ジャッジ時間 | 4,257 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
#pragma GCC optimize("Ofast", "unroll-loops")
#pragma GCC target("avx2")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
constexpr ll mod = 998244353LL;
ll modpow(ll a, int b){
if (b == 0) return 1LL;
ll tmp = modpow(a, b / 2);
tmp = tmp * tmp % mod;
if (b % 2 == 0) return tmp;
return tmp * a % mod;
}
ll inverse(ll a){ return modpow(a, mod - 2); }
int N;
vector<int> A;
void input(void){
cin >> N;
A.resize(N);
for (int& ai : A)
cin >> ai;
}
ll solve(void){
constexpr int offset = 2;
static ll dp[2][5];
dp[0][A[0] + offset] = 1LL;
ll ret = dp[0][0];
ll tmp = 1LL;
for (int i = 1; i < N; ++i){
int a = A[i];
for (int j = 0; j < 5; ++j)
dp[i & 1][j] = 0;
dp[i & 1][a + offset] = tmp;
for (int prv = -2; prv <= 2; ++prv){
int nxt = prv * a;
if (abs(nxt) <= 2){
dp[i & 1][nxt + offset] += dp[(i - 1) & 1][prv + offset];
dp[i & 1][nxt + offset] %= mod;
}
}
if (i < N - 1)
ret = ret * 2 % mod;
ret += dp[i & 1][0];
tmp = tmp * 2 % mod;
}
return ret * inverse(tmp) % mod;
}
int main(void){
input();
cout << solve() << endl;
return 0;
}