题解 AT2326 【数列と計算】
-
一个式子里既有加号又有乘号,不好处理,可以想最后一个加号的位置,有
n-1 种情况: -
定义
f[i]
为前i个数据题意求出的和,有:
- 将第一项拆开,得到
- 然后就根据这个式子求就可以了
f[i] = s[i-1] + sp[i] + p[i];//一一对应
- 代码
#include <cstdio> #define int long long using namespace std; const int N = 1e5+5, M = 1e9+7; int n, a[N], f[N], s[N], sp[N], p[N]; int qpow(int a, int x) { int ans = 1; while (x) { if (x & 1) ans = ans * a % M; a = a * a % M; x >>= 1; } return ans; } signed main() { scanf("%lld", &n); for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]); f[1] = s[1] = p[1] = a[1] % M; for (int i = 2; i <= n; ++i) { sp[i] = (sp[i-1] * a[i] % M + a[i] * qpow(2, i-2) % M) % M; p[i] = p[i-1] * a[i] % M; f[i] = (s[i-1] + sp[i] + p[i]) % M; s[i] = (s[i-1] + f[i]) % M; } printf("%lld\n", f[n]); return 0; }