#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

long long tab[300007];
long long ile[300007];
const long long M = 1000000007;

long long roznice[300007];
map <long long, int> pskal; // skalowanie parzystych różnic
map <long long, int> nskal; // skalowanie nieparzystych różnic

long long niep[1048587]; // drzewo nieparzystych
long long parz[1048587]; // drzewo parzystych

void dodaj(long long* drzewo, int i, long long wart) {
	//cout<<"dodaj "<<i<<" "<<wart<<endl;
	drzewo[i] = (drzewo[i] + wart) % M;
	//cout<<"drzewo["<<i<<"] = "<<drzewo[i]<<endl;
	i /= 2;
	while (i > 0) {
		drzewo[i] = (drzewo[2 * i] + drzewo[2 * i + 1]) % M;
		//cout<<"drzewo["<<i<<"] = "<<drzewo[i]<<endl;
		i /= 2;
	}
}

long long czytaj(long long* drzewo, int ojc, int a, int b, int pocz, int kon) { // zwraca sumę przedziału pocz-kon
	//cout<<"czytaj: ojc = "<<ojc<<" a = "<<a<<" b = "<<b<<" pocz = "<<pocz<<" kon = "<<kon<<endl;
	if (a > kon || b < pocz) {
		return 0;
	}
	if (a >= pocz && b <= kon) {
		//cout<<"zwracam "<<drzewo[ojc]<<endl;
		return drzewo[ojc];
	}
	return (czytaj(drzewo, 2 * ojc, a, (a + b) / 2, pocz, kon) + czytaj(drzewo, 2 * ojc + 1, (a + b) / 2 + 1, b, pocz, kon)) % M;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	int n;
	cin>>n;
	
	for (int i = 0; i < n; i++) {
		cin>>tab[i];
		if (i > 0) {
			tab[i] = (tab[i] + tab[i - 1]) % M;
		}
		roznice[i] = tab[i];
	}
	
	// skalowanie
	sort(roznice, roznice + n);
	for (int i = 0; i < n; i++) {
		if (i == 0 || roznice[i] != roznice[i - 1]) {
			if (roznice[i] % 2 == 0)
				pskal.insert({roznice[i], pskal.size()});
			else
				nskal.insert({roznice[i], nskal.size()});
		}
	}
	
	int mparz = 1; // rozmiar drzewa dla parzystych
	while (mparz < pskal.size()) mparz *= 2;
	//cout<<"mparz = "<<mparz<<endl;
	
	int mniep = 1; // rozmiar drzewa dla nieparzystych
	while (mniep < nskal.size()) mniep *= 2;
	//cout<<"mniep = "<<mniep<<endl;
	
	for (int i = 0; i < n; i++) {
		if (tab[i] % 2 == 0) {
			ile[i] = 1;
			
			// bierzemy parzyste mniejsze równe
			//cout<<"parzyste <= "<<tab[i]<<endl;
			map<long long, int>::iterator it = pskal.upper_bound(tab[i]); // pierwszy większy parzysty (lub end jeśli nie ma)
			int kon = (it == pskal.end()) ? kon = pskal.size() - 1 : it->second - 1;
			ile[i] += czytaj(parz, 1, mparz, 2 * mparz - 1, mparz, kon + mparz);
			ile[i] %= M;
			
			// bierzemy nieparzyste większe
			//cout<<"nieparzyste > "<<tab[i]<<endl;
			it = nskal.upper_bound(tab[i]); // pierwszy większy nieparzysty (lub end jeśli nie ma)
			if (it != nskal.end()) { // jeśli w ogóle jest jakiś nieparzysty
				int pocz = it->second;
				ile[i] += czytaj(niep, 1, mniep, 2 * mniep - 1, pocz + mniep, 2 * mniep - 1);
				ile[i] %= M;
			}
			
			dodaj(parz, pskal[tab[i]] + mparz, ile[i]);
		}
		else {
			// bierzemy nieparzyste mniejsze równe
			//cout<<"nieparzyste <= "<<tab[i]<<endl;
			map<long long, int>::iterator it = nskal.upper_bound(tab[i]); // pierwszy większy nieparzysty (lub end jeśli nie ma)
			int kon = (it == nskal.end()) ? nskal.size() - 1 : it->second - 1;
			ile[i] += czytaj(niep, 1, mniep, 2 * mniep - 1, mniep, kon + mniep);
			ile[i] %= M;
			
			// bierzemy parzyste większe
			//cout<<"parzyste > "<<tab[i]<<endl;
			//cout<<"tab["<<i<<"] = "<<tab[i]<<endl;
			it = pskal.upper_bound(tab[i]);
			if (it != pskal.end()) {
				int pocz = it->second;
				ile[i] += czytaj(parz, 1, mparz, 2 * mparz - 1, pocz + mparz, 2 * mparz - 1);
				ile[i] %= M;
			}
			
			dodaj(niep, nskal[tab[i]] + mniep, ile[i]);
		}
		//cout<<i<<" "<<tab[i]<<endl;
		
		/*
		if (tab[i] % 2 == 0) ile2[i] = 1;	
		for (int j = 0; j < i; j++) {
			if (tab[j] <= tab[i] && tab[j] % 2 == tab[i] % 2) {
				ile2[i] += ile2[j];
				ile2[i] %= M;
				//cout<<"przdluzam mniejsze tej samej parzystości "<<j<<" "<<tab[j]<<" do "<<ile2[i]<<endl;
			}
			else if (tab[j] > tab[i] && tab[j] % 2 != tab[i] % 2) {
				ile2[i] += ile2[j];
				ile2[i] %= M;
				//cout<<"przdluzam wieksze innej parzystosci "<<j<<" "<<tab[j]<<" do "<<ile2[i]<<endl;
			}
		}
		if (ile[i] != ile2[i]) break;
		*/
	}

 	cout<<ile[n - 1]<<"\n";
}
