LL fac[maxn];
LL inv[maxn];
char s[maxn];
LL qpow(LL a,LL b)
{
LL ans = 1;
while(b>0)
{
if(b&1) ans = ans*a%mod;
a = a*a%mod;
b/=2;
}
return ans;
}
void init()
{
fac[0] = 1;
for(int i=1;i<maxn;i++) fac[i] = fac[i-1]*i%mod;
inv[0] = 1;
for(int i=1;i<maxn;i++) inv[i] = qpow(fac[i],mod-2);
}
LL C(int n,int m)
{
//printf("n=%d m=%d\n",n,m);
if(n<m) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
LL cal(int num)
{
int len = strlen(s);
int cnt = 0;
LL ans = 0;
for(int i=0;i<len;i++)
{
if(s[i]=='0') continue;
//printf("num-cnt=%d\n",num-cnt);
ans = (ans + C(len-i-1,num-cnt))%mod; //当前位作为0后面的数组合时能满足小于N的情况
//printf("abs=%lld\n",ans);
cnt++;
if(cnt==num)
{
ans = (ans+1)%mod; //加上前num个1都不设为0的情况
break;
}
}
return ans;
}