#include<bits/stdc++.h>
using namespace std;
#define Mod 1000000007;
long int ans=0;
bool check(string S1, string S2) //function to check 2 string partitions are valid or not.
{
if(S1.length()>S2.length())
return false;
if(S2[0]=='0'||S1[0]=='0') //if first character is 0 return false.
return false;
if(count(S1.begin(),S1.end(),'1')>count(S2.begin(),S2.end(),'1')) //if number of 1's in first is larger than 1's in second string
return false; //return false;
return true; //if upper condition is false then return true.
}
void Partition(string &S,int i,int j,int len=1,string Prev="")//S is actual string, i starting index(of a partition), j is end index.
{ //len is length of first string partition, prev is previous partition.
if(S[i]=='0') //if first index char is '0' partition is not possible.
return ;
if(i==j||j-(i+len)+1<len) //base condition if length of other partition is less than first then return.
{
return ;
}
for(int k=i;j-(k+len)+1>=len;len++)
{
if(S[k+len]=='0')
continue;
if(Prev!="")
{
if(check(Prev,S.substr(k,len))) //first checking with prev partition then with second partion.
{
if(check(S.substr(k,len),S.substr(k+len)))
{
ans=(ans+1)%Mod;
Prev=S.substr(k,len);// storing Prev
Partition(S,k+len,j,len,Prev); //checking for next partition from k+len with prev partition
}
}
}
else
{
if(check(S.substr(k,len),S.substr(k+len)))
{
ans=(ans+1)%Mod;
Prev=S.substr(k,len);
Partition(S,k+len,j,len,Prev);
}
}
}
return ;
}
int main()
{
int n;
string S;
cin>>n>>S;
string prev="";
Partition(S,0,S.length()-1);
cout<<ans+1<<"\n";
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNb2QgMTAwMDAwMDAwNzsKbG9uZyBpbnQgYW5zPTA7CmJvb2wgY2hlY2soc3RyaW5nIFMxLCBzdHJpbmcgUzIpICAgIC8vZnVuY3Rpb24gdG8gY2hlY2sgMiBzdHJpbmcgcGFydGl0aW9ucyBhcmUgdmFsaWQgb3Igbm90Lgp7CiAgICBpZihTMS5sZW5ndGgoKT5TMi5sZW5ndGgoKSkKICAgIHJldHVybiBmYWxzZTsKICAgIGlmKFMyWzBdPT0nMCd8fFMxWzBdPT0nMCcpICAgICAgICAgIC8vaWYgZmlyc3QgY2hhcmFjdGVyIGlzIDAgcmV0dXJuIGZhbHNlLgogICAgcmV0dXJuIGZhbHNlOwogICAgaWYoY291bnQoUzEuYmVnaW4oKSxTMS5lbmQoKSwnMScpPmNvdW50KFMyLmJlZ2luKCksUzIuZW5kKCksJzEnKSkgLy9pZiBudW1iZXIgb2YgMSdzIGluIGZpcnN0IGlzIGxhcmdlciB0aGFuIDEncyBpbiBzZWNvbmQgc3RyaW5nCiAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOyAvL2lmIHVwcGVyIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGVuIHJldHVybiB0cnVlLgp9CgoKdm9pZCBQYXJ0aXRpb24oc3RyaW5nICZTLGludCBpLGludCBqLGludCBsZW49MSxzdHJpbmcgUHJldj0iIikvL1MgaXMgYWN0dWFsIHN0cmluZywgaSBzdGFydGluZyBpbmRleChvZiBhIHBhcnRpdGlvbiksIGogaXMgZW5kIGluZGV4LiAKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xlbiBpcyBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nIHBhcnRpdGlvbiwgcHJldiBpcyBwcmV2aW91cyBwYXJ0aXRpb24uICAgICAgICAgICAKICAgIGlmKFNbaV09PScwJykgIC8vaWYgZmlyc3QgaW5kZXggY2hhciBpcyAnMCcgcGFydGl0aW9uIGlzIG5vdCBwb3NzaWJsZS4KICAgIHJldHVybiA7CiAgICBpZihpPT1qfHxqLShpK2xlbikrMTxsZW4pIC8vYmFzZSBjb25kaXRpb24gaWYgbGVuZ3RoIG9mIG90aGVyIHBhcnRpdGlvbiBpcyBsZXNzIHRoYW4gZmlyc3QgdGhlbiByZXR1cm4uCiAgICB7CiAgICByZXR1cm4gOwogICAgfQogICAgZm9yKGludCBrPWk7ai0oaytsZW4pKzE+PWxlbjtsZW4rKykKICAgIHsgICAKICAgICAgICBpZihTW2srbGVuXT09JzAnKQogICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmKFByZXYhPSIiKQogICAgICAgIHsKICAgICAgICAgICAgaWYoY2hlY2soUHJldixTLnN1YnN0cihrLGxlbikpKSAvL2ZpcnN0IGNoZWNraW5nIHdpdGggcHJldiBwYXJ0aXRpb24gdGhlbiB3aXRoIHNlY29uZCBwYXJ0aW9uLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihjaGVjayhTLnN1YnN0cihrLGxlbiksUy5zdWJzdHIoaytsZW4pKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgYW5zPShhbnMrMSklTW9kOwogICAgICAgICAgICAgICAgICAgIFByZXY9Uy5zdWJzdHIoayxsZW4pOy8vIHN0b3JpbmcgUHJldiAKICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb24oUyxrK2xlbixqLGxlbixQcmV2KTsgLy9jaGVja2luZyBmb3IgbmV4dCBwYXJ0aXRpb24gZnJvbSBrK2xlbiB3aXRoIHByZXYgcGFydGl0aW9uICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYoY2hlY2soUy5zdWJzdHIoayxsZW4pLFMuc3Vic3RyKGsrbGVuKSkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFucz0oYW5zKzEpJU1vZDsKICAgICAgICAgICAgICAgICAgICBQcmV2PVMuc3Vic3RyKGssbGVuKTsKICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb24oUyxrK2xlbixqLGxlbixQcmV2KTsgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgIH0KICAgIHJldHVybiA7Cn0KaW50IG1haW4oKQp7CgogICAgaW50IG47ICAgCiAgICBzdHJpbmcgUzsKICAgIGNpbj4+bj4+UzsKICAgIHN0cmluZyBwcmV2PSIiOwogICAgUGFydGl0aW9uKFMsMCxTLmxlbmd0aCgpLTEpOwogICAgY291dDw8YW5zKzE8PCJcbiI7Cn0=