# |
Author |
Problem |
Lang |
Verdict |
Time |
Memory |
Sent |
Judged |
|
40353105 |
Practice:
dx24816 |
1009E
- 8
|
C++14 (GCC 6-32)
|
Accepted
|
1232 ms
|
7836 KB
|
2018-07-14 21:12:52 |
2018-07-15 08:16:48 |
|
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD = 998244353;
const ll twoInverse = 499122177;
void fast_io(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
}
ll mult(ll a,ll b){
long long result = 0;
a %= MOD;
while (b){
if (b & 1){
result = (result + a) % MOD;
}
a = (2 * a) % MOD;
b >>= 1;
}
return result;
}
ll pow2(ll exp) {
ll base = 2;
base %= MOD;
ll result = 1;
while (exp > 0){
if (exp & 1){
result = (result * base) % MOD;
}
base = (base * base) % MOD;
exp >>= 1;
}
return result;
}
const int MAX = 1000007;
ll prefix [MAX];
int main(){
fast_io();
ll n;
cin >> n;
for(int i = 0; i<n; i++){
ll d;
cin >>d;
if(i == 0){
prefix[i+1] = mult(d, pow2(n-1));
}
else{
prefix[i+1] = (prefix[i] + mult(pow2(n-1-i), d))%MOD;
}
}
ll ans = 0;
for(int i = 0; i<n; i++){
if(i == 0){
ans += prefix[n];
ans = ans % MOD;
}
else if(i == 1){
ans += mult(prefix[n-1], twoInverse);
ans = ans % MOD;
}
else{
ans += (mult(prefix[n-i], twoInverse))% MOD;
ans = ans%MOD;
}
}
cout << ans << endl;
return 0;
}
Click to see test details