A scientist, E. Collie, is going to do some experiments with bacteria. Right now, she has one bacterium. She already knows that this species of bacteria doubles itself every hour. Hence, after one hour there will be 2
bacteria.
E. Collie will do one experiment every hour, for n
consecutive hours. She starts the first experiment exactly one hour after the first bacterium starts growing. In experiment i she will need bi
bacteria.
How many bacteria will be left directly after starting the last experiment? If at any point there are not enough bacteria to do the experiment, print “error”.
Since the answer may be very large, please print it modulo 109+7
.
Input
The input consists of two lines.
The first line contains an integer 1≤n≤105
, the number of experiments.
The second line contains n
integers b1,…,bn, where 0≤bi≤260 is the number of bacteria used in the i
th experiment.
Output
Output a single line containing the number of bacteria that remains after doing all the experiments, or “error”.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =1e5+10;
const ll mod =1e9+7;
ll solve(int x,int y)
{
ll ans=1;
ll cnt=x;
while(y)
{
if(y&1)
{
ans*=cnt;
}
cnt*=cnt;
y/=2;
}
return ans;
}
int main()
{
ll n;
scanf("%lld",&n);
ll a[maxn];
for(ll i=0; i<n; i++)
{
scanf("%lld",&a[i]);
}
ll num=1;
ll max1=solve(2,60);
int flag1=0;
int flag=1;
for(ll i=0; i<n; i++)
{
if(num>max1)
{
flag1=1;
}
if(flag1)
{
num=(num*2-a[i]%mod+mod)%mod;
}
else
{
num*=2;
if(num<a[i])
{
flag=0;
break;
}
num-=a[i];
}
}
num%=mod;
if(!flag)
printf("error\n");
else
printf("%lld\n",num);
return 0;
}