链接
题解
30
%
30\%
30%的数据显然是
d
p
dp
dp,
f
i
j
f_{ij}
fij表示长度为
i
i
i结尾字母为
j
j
j的串的数目
100
%
100\%
100%的数据直接矩阵快速幂优化
代码
#include <bits/stdc++.h>
#define maxn 30
#define mod 1000000007ll
#define rep(_,__) for(_=1;_<=(__);_++)
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
struct Matrix
{
ll n, m, a[30][30];
ll *operator[](ll x){return a[x];}
Matrix(ll x, ll y):n(x),m(y){cl(a);}
};
Matrix operator*(Matrix a, Matrix b)
{
Matrix t(a.n,b.m);
ll i, j, k;
rep(i,t.n)rep(k,a.m)rep(j,t.m)(t[i][j]+=a[i][k]*b[k][j])%=mod;
return t;
}
Matrix operator^(Matrix a, ll b)
{
ll i, j;
Matrix t(a.n,a.m), ans(a.n,a.m);
rep(i,a.n)rep(j,a.m)t[i][j]=a[i][j];
rep(i,a.n)ans[i][i]=1;
for(;b;b>>=1,t=t*t)if(b&1)ans=ans*t;
return ans;
}
char s[100010];
int main()
{
ios::sync_with_stdio(false);
Matrix m(26,26), f(1,26);
ll i, n, j, k;
cin>>k>>s+1;
n=strlen(s+1);
rep(i,26)rep(j,26)m[i][j]=1;
for(i=1;i<n;i++)
{
ll x=s[i]-'a'+1, y=s[i+1]-'a'+1;
m[x][y]=0;
}
for(i=1;i<=26;i++)f[1][i]=1;
f=f*(m^(k-1));
ll ans=0;
for(i=1;i<=26;i++)(ans+=f[1][i])%=mod;
cout<<ans;
return 0;
}