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); }