1. 程式人生 > 實用技巧 >CF1009E Intercity Traveling(數學、找規律)

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