1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h> const int MOD=1'000'000'000+7; using namespace std; typedef long long ll; #define rep(i,a,n) for (ll i=a;i<(ll)(n);i++) ll read(){ll r;scanf("%lld",&r);return r;} const int N = 5000; char s[N+10];
vector<ll> polymul(const vector<ll> &v0,const vector<ll>&v1,int polymxpwr){ vector<ll> ret(min(polymxpwr+1,(int)v0.size()+(int)v1.size()-1),0); rep(i,0,size(v0)) rep(j,0,size(v1)) if(i+j < (int)ret.size()) (ret[i+j]+=v0[i]*v1[j]%MOD)%=MOD; return ret; }
vector<ll> polypwr(vector<ll> t,int pwr,int polymxpwr){ vector<ll> ret={1}; while(pwr){ if(pwr&1) ret=polymul(ret,t,polymxpwr); t=polymul(t,t,polymxpwr); pwr/=2; } return ret; }
int main(){ vector t(N+1,vector<ll>(N+1,0)); t[0][0] = 1; rep(i,0,N) rep(j,0,N+1) if(t[j][i]!=0) { (t[j+1] [i+1]+=t[j][i]*2%MOD)%=MOD; (t[max(j-1,0ll)][i+1]+=t[j][i] )%=MOD; } auto g=t[0]; rep(i,0,N+1)rep(j,0,N+1) t[i][j]=0; t[0][0] = 1; rep(i,0,N) rep(j,0,N+1) if(t[j][i]!=0) { (t[j+1] [i+1]+=t[j][i]*2%MOD)%=MOD; if(j) (t[max(j-1,0ll)][i+1]+=t[j][i] )%=MOD; } auto f=t[0]; int n=read(); scanf("%s",s); int sz=strlen(s); auto ans = polymul(g, polypwr(f,sz,n-sz),n-sz); printf("%lld\n",(((n-sz < (int)ans.size()) ? ans[n-sz] : 0 )+MOD)%MOD); return 0; }
|