#include #include #include #include using namespace std; typedef long long ll; typedef vector vl; typedef vector vvl; const ll mod=1e9+7; const ll M=2005; ll C[M][M],P[M][M]; void Init(){ C[0][0]=P[0][0]=1; for(int i=0;ij) C[i][j]=C[i-1][j]; if(i&&j) (C[i][j]+=C[i-1][j-1])%=mod; if(j) P[i][j]=P[i-1][j-1]*i%mod; else P[i][j]=1; } } int n; class Trie{ private: const int MAX=210000; int ID=1; vvl date; vl a,u,dp; void Fix(vl& dp,ll h,int v){ if(u[v]==1){ dp[1]=1; return; } for(int i=1;i<=u[v];i++) (dp[i]+=P[u[v]][i]%mod*h)%=mod; } void dfs(int v,vl& dp,ll& h){ if(a[v]==1){ for(int i=0;i<27;i++) if(date[v][i]!=-1) dfs(date[v][i],dp,h); h++; return; } int S; bool b=1; for(int i=0;i<27;i++){ int v_=date[v][i]; if(v_!=-1){ vl DP(u[v_]+1); ll H=0; dfs(v_,DP,H); Fix(DP,H,v_); if(b){ dp=DP; b=0; S=u[v_]; } else{ vl dp_(S+u[v_]+1); for(int j=0;j<=S;j++) for(int k=0;k<=u[v_];k++) (dp_[j+k]+=(P[u[v_]][k]*dp[j]%mod+P[S][j]*DP[k]%mod)*C[j+k][j])%=mod; S+=u[v_]; dp=dp_; } } } if(!a[v]) dp=vl(2); for(int i=1;i<=u[v];i++) (dp[i]+=(i-(i==u[v]?1:0))*P[u[v]][i])%=mod; } public: Trie(){ date=vvl(MAX,vl(27,-1)); a=u=vl(MAX); } void Update(string s){ int S=s.size(),I=0; u[0]++; for(int i=0;i>n; Trie trie; for(int i=0;i>s; s+="{"; trie.Update(s); } trie.Solve(); }