依次求每一段公里的期望消耗即可,这是可以递推的
dp[i]表示每公里的期望消耗
dp[i]=1/2*a1+1/4*a2 +...+1/2^(i-1)*ai-1 + 1/2^(i-1)*ai
注意最后一项是没有间断的道路的期望
虽然是算期望,但是实际上是算概率
概率从1到n递推即可
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn = 1e6+10; const ll mod = 998244353; int n; ll a[maxn],dp[maxn],P[maxn]; int main(){ cin>>n; for(int i=1;i<=n;i++)scanf("%lld",&a[i]); P[0]=1; for(int i=1;i<=n;i++)P[i]=P[i-1]*2%mod; dp[1]=a[1]*P[n-1]%mod; for(int i=2;i<=n;i++){ dp[i]=((dp[i-1]-a[i-1]*P[n-i]%mod)%mod+mod)%mod; dp[i]=(dp[i]+a[i]*P[n-i]%mod)%mod; } ll ans=0; for(int i=1;i<=n;i++) ans=(ans+dp[i])%mod; cout<<ans<<' '; }