#include <bits/stdc++.h>
using namespace std;
#define for1(i,m,n) for(int i=m,n_=(n);i<=n_;i++)
#define for0(i,m,n) for(int i=m;i<n;i++)
#define forr1(i,m,n) for(int i=m;i>=n;i--)
#define forr2(i,m,n) for(int i=m;i>n;i--)
#define mini(a,b) (a)=min((a),(b))
#define maxi(a,b) (a)=max((a),(b))
#define ll long long
#define el '\n'
#define fi first
#define se second
#define ii pair<ll,int>
#define vll(i) i.begin(),i.end()
#define pb push_back
#define fr front()
#define int long long
#define MASK(i) ((1ll) << (i))
#define BIT(i,n) (((i)>>(n))&1)
const string NAME= "hamming";
const int N=1e5+ 30;
const int MOD=1e9 + 9;
int n;
vector< ii > v;
int f[N], dp[N];
int Get( int x){
int s = 0;
for( int x_ = x; x_ > 0; x_ -= x_ & -x_)
s = ( s + dp[x_]) % MOD;
return s;
}
void Update( int x, int val) {
for(int x_ = x; x_ <= n; x_ += x_ & -x_)
dp[x_] = (dp[x_] + val) % MOD;
}
signed main() {
if (fopen((NAME + ".INP").c_str(), "r")) {
freopen((NAME + ".INP").c_str(), "r", stdin);
freopen((NAME + ".OUT").c_str(), "w", stdout);
}
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n; n++;
for1(i,2,n) {
int x; cin >> x;
f[i] = f[i - 1] + x;
v.pb({f[i], i});
}
v.pb({0, 1});
sort(vll(v));
int ans = 0;
for(auto [x,id]:v){
int t = Get( id);
if ( id == 1)
Update( id, 1);
else Update(id, t);
if( id == n){
cout << t;
return 0;
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZvcjEoaSxtLG4pIGZvcihpbnQgaT1tLG5fPShuKTtpPD1uXztpKyspCiNkZWZpbmUgZm9yMChpLG0sbikgZm9yKGludCBpPW07aTxuO2krKykKI2RlZmluZSBmb3JyMShpLG0sbikgZm9yKGludCBpPW07aT49bjtpLS0pCiNkZWZpbmUgZm9ycjIoaSxtLG4pIGZvcihpbnQgaT1tO2k+bjtpLS0pCiNkZWZpbmUgbWluaShhLGIpIChhKT1taW4oKGEpLChiKSkKI2RlZmluZSBtYXhpKGEsYikgKGEpPW1heCgoYSksKGIpKQojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsICdcbicKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGlpIHBhaXI8bGwsaW50PgojZGVmaW5lIHZsbChpKSBpLmJlZ2luKCksaS5lbmQoKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZyIGZyb250KCkKI2RlZmluZSBpbnQgbG9uZyBsb25nIAojZGVmaW5lIE1BU0soaSkgKCgxbGwpIDw8IChpKSkKI2RlZmluZSBCSVQoaSxuKSAoKChpKT4+KG4pKSYxKQpjb25zdCBzdHJpbmcgTkFNRT0gImhhbW1pbmciOwpjb25zdCBpbnQgTj0xZTUrIDMwOwpjb25zdCBpbnQgTU9EPTFlOSArIDk7CmludCBuOwp2ZWN0b3I8IGlpID4gdjsKaW50ICBmW05dLCBkcFtOXTsKaW50IEdldCggaW50IHgpewogaW50IHMgPSAwOwogZm9yKCBpbnQgeF8gPSB4OyB4XyA+IDA7IHhfIC09IHhfICYgLXhfKSAKICAgcyA9ICggcyArIGRwW3hfXSkgJSBNT0Q7CiAgIAogIHJldHVybiBzOwogIAp9CnZvaWQgVXBkYXRlKCBpbnQgeCwgaW50IHZhbCkgewogIGZvcihpbnQgeF8gPSB4OyB4XyA8PSBuOyB4XyArPSB4XyAmIC14XykgCiAgIGRwW3hfXSA9IChkcFt4X10gKyB2YWwpICUgTU9EOwp9CnNpZ25lZCBtYWluKCkgewppZiAoZm9wZW4oKE5BTUUgKyAiLklOUCIpLmNfc3RyKCksICJyIikpIHsKZnJlb3BlbigoTkFNRSArICIuSU5QIikuY19zdHIoKSwgInIiLCBzdGRpbik7CmZyZW9wZW4oKE5BTUUgKyAiLk9VVCIpLmNfc3RyKCksICJ3Iiwgc3Rkb3V0KTsKfQppb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsKY2luLnRpZSgwKTsKY291dC50aWUoMCk7CgogY2luID4+IG47IG4rKzsKZm9yMShpLDIsbikgewogIGludCB4OyBjaW4gPj4geDsKICBmW2ldID0gZltpIC0gMV0gKyB4OwogIHYucGIoe2ZbaV0sIGl9KTsKfQp2LnBiKHswLCAxfSk7CnNvcnQodmxsKHYpKTsKaW50IGFucyA9IDA7Cgpmb3IoYXV0byBbeCxpZF06dil7CiAgaW50IHQgPSBHZXQoIGlkKTsKIGlmICggaWQgPT0gMSkKICBVcGRhdGUoIGlkLCAgMSk7CiAgZWxzZSBVcGRhdGUoaWQsIHQpOwogIGlmKCBpZCA9PSBuKXsKICAgIGNvdXQgPDwgdDsKICAgIHJldHVybiAwOwogIH0KfQoKfQ==