CF1009E Intercity Traveling(数学、找规律)

题意:

给出一个数组a,a(i)表示你连续行驶i公里后的消耗。

你可以在任意时刻休息。

一共有2^(n-1)次休息方案。

询问所有休息方案消耗体力的总和。

题解:

推导可得,每个数组元素的贡献是2^(n-i)+2^(n-i-1)*(n-i)。

注意快速幂部分的取模。

//a[i]的出现次数是2^(n-i)+2^(n-i-1)*(n-i)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
inline int read () {
    int x=0;
    int f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9') {
        if (ch=='-') f=-1;ch=getchar();
    }
    while (ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
ll qpow (ll a,ll b) {
    ll ans=1;
    ll base=a%mod;
    while (b>0) {
        if (b&1) ans*=base%mod;
        ans%=mod;
        base%=mod;
        base*=base%mod;
        b>>=1;
    }
    return ans;
}
const int maxn=1e6+100;
int n;
int a[maxn];
int main () {
    scanf("%d",&n);
    for (int i=1;i<=n;i++) a[i]=read();
    ll ans=0;
    for (int i=1;i<=n;i++) ans+=(qpow(2,n-i)+qpow(2,n-i-1)*(n-i)%mod)%mod*a[i]%mod,ans%=mod;
    ans=(ans+mod)%mod;
    printf("%lld\n",ans);
}

 

posted @ 2020-09-07 14:53  zlc0405  阅读(189)  评论(0编辑  收藏  举报