思路:根据给的递归函数找规律,画一画可以发现原函数是一颗满二叉树,最后计算的是叶子节点的值之和,每增加一层(增加一个数),相当于在原来基础上增加了一个同样规模的右子树,它的每个叶子节点的值都等于左边对应节点的值乘上增加节点对应的值。
那么得出递推式 ans=ans+ans*a[i],ans初值为1。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int main()
{
int n;
while(cin>>n)
{
ll ans=1;
for(int i=0;i<n;i++)
{
ll x;
scanf("%lld",&x);
x%=mod;
ans=(ans+ans*x%mod)%mod;
}
cout<<ans<<endl;
}
return 0;
}