結果
| 問題 | No.2550 MORE! JUMP! MORE! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-11-22 08:10:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 29 ms / 2,000 ms |
| コード長 | 3,284 bytes |
| コンパイル時間 | 1,995 ms |
| コンパイル使用メモリ | 196,256 KB |
| 最終ジャッジ日時 | 2025-02-17 22:51:42 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template <long long Modulus>
struct ModInt{
long long val;
constexpr ModInt(const long long &_val = 0) noexcept : val(_val) {
normalize();
}
void normalize(){
val = (val % Modulus + Modulus) % Modulus;
}
inline ModInt& operator+=(const ModInt& rhs) noexcept {
if(val += rhs.val, val >= Modulus) val -= Modulus;
return *this;
}
inline ModInt& operator-=(const ModInt& rhs) noexcept {
if(val -= rhs.val, val < 0) val += Modulus;
return *this;
}
inline ModInt& operator*=(const ModInt& rhs) noexcept {
val = val * rhs.val % Modulus;
return *this;
}
inline ModInt& operator/=(const ModInt& rhs) noexcept {
val = val * inv(rhs.val).val % Modulus;
return *this;
}
inline ModInt& operator++() noexcept {
if(++val >= Modulus) val -= Modulus;
return *this;
}
inline ModInt operator++(int) noexcept {
ModInt t = val;
if(++val >= Modulus) val -= Modulus;
return t;
}
inline ModInt& operator--() noexcept {
if(--val < 0) val += Modulus;
return *this;
}
inline ModInt operator--(int) noexcept {
ModInt t = val;
if(--val < 0) val += Modulus;
return t;
}
inline ModInt operator-() const noexcept { return (Modulus - val) % Modulus; }
inline ModInt inv(void) const { return inv(val); }
ModInt inv(const long long& n) const {
long long a = n, b = Modulus, u = 1, v = 0;
while(b){
long long t = a / b;
a -= t * b; swap(a, b);
u -= t * v; swap(u, v);
}
u %= Modulus;
if(u < 0) u += Modulus;
return u;
}
friend inline ModInt operator+(const ModInt& lhs, const ModInt& rhs) noexcept { return ModInt(lhs) += rhs; }
friend inline ModInt operator-(const ModInt& lhs, const ModInt& rhs) noexcept { return ModInt(lhs) -= rhs; }
friend inline ModInt operator*(const ModInt& lhs, const ModInt& rhs) noexcept { return ModInt(lhs) *= rhs; }
friend inline ModInt operator/(const ModInt& lhs, const ModInt& rhs) noexcept { return ModInt(lhs) /= rhs; }
friend inline bool operator==(const ModInt& lhs, const ModInt& rhs) noexcept { return lhs.val == rhs.val; }
friend inline bool operator!=(const ModInt& lhs, const ModInt& rhs) noexcept { return lhs.val != rhs.val; }
friend inline istream& operator>>(istream& is, ModInt& x) noexcept {
is >> x.val;
x.normalize();
return is;
}
friend inline ostream& operator<<(ostream& os, const ModInt& x) noexcept { return os << x.val; }
};
const long long MOD = 998244353;
using mint = ModInt<MOD>;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
vector<mint> a(n);
for(int i = 0; i < n; i++){
cin >> a[i];
}
vector<mint> pow2(n + 1, 1);
for(int i = 1; i <= n; i++){
pow2[i] = pow2[i - 1] * 2;
}
mint ans = 0;
for(long long i = 1; i <= n; i++){
mint res = pow2[max(0LL, i - 2)] * (i - 1) + pow2[i - 1];
res *= a[i - 1];
res *= pow2[max(0LL, n - i - 1LL)];
ans += res;
}
cout << ans << endl;
}