题意: 解法: 设d[i]为前i个数,所有子序列乘积的和. 对于a[i],如果我们将他接到之前的子序列后面,那么答案为d[i-1]*a[i], 如果不将他接到之前的子序列后面,同时也不使用他,那么答案为d[i-1]. 如果单独令他作为一个新的子序列头部,那么答案为a[i]. 因此转移方程为: d[i]=(d[i-1]*a[i]+d[i-1]+a[i]). 最后d[n]就是答案. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=1e6+5; const int mod=1e9+7; int d[maxm]; int a[maxm]; int n; void solve(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ d[i]=(d[i-1]*a[i]%mod+d[i-1]+a[i])%mod; } cout<<d[n]<<endl; } signed main(){ ios::sync_with_stdio(0); solve(); return 0; }