#include #include #include using namespace std; using namespace atcoder; using mint = modint1000000007; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000005 #define Inf64 1000000000000000001LL vector>> merge(const vector>>& a, const vector>>& b) { vector res(2,vector(2,vector(3,0))); rep(i,2){ rep(j,2){ rep(k,3){ res[i][j][k] += a[i][j][k]; res[i][j][k] += b[i][j][k]; } } } rep(i,2){ rep(j,2){ rep(k,2){ rep(l,3){ rep(m,3){ if(l+m>2)continue; mint v = 1; if(l==1 && m==1)v = mint(2).inv(); res[i][k][l+m] += a[i][j][l] * b[j^1][k][m] * v; } } } } } return res; } int main(){ string s; cin>>s; vector dp(2,vector(2,vector(3,0))); rep(i,s.size()){ vector ndp(2,vector(2,vector(3,0))); ndp[s[i]-'0'][s[i]-'0'][0]++; ndp[s[i]-'0'][s[i]-'0'][1]+=2; ndp[s[i]-'0'][s[i]-'0'][2]++; rep(j,2){ rep(k,2){ rep(l,3){ rep(ll,3){ if(ll>K; K--; rep(i,60){ if((K>>i)&1){ ans = merge(ans,dp); } dp = merge(dp,dp); } mint ansa = 0; rep(i,2){ rep(j,2){ ansa +=ans[i][j][2]; } } cout<