题目描述
给定一个小写字母字符串T
求有多少长度为m的小写字母字符串S满足,T是S的一个子序列(不需要连续)
输入描述:
第一行一个字符串T
第二行一个正整数m
输出描述:
输出答案对109+7取模的值
示例1
输入
a
2
输出
51
说明
长度为2的里面有a的串有51种
备注:
1<=|T|,m<=105
枚举终点,前面的除了已经确定的 每个有25种选法,后面的每个有26种选法,前面的加个组合数就好,注意终点的值是确定的为T字符串的最后一个字符,所以组合数应写成c(i-1,lens-1),i表示终点,lens是字符串t的长度。
#include<iostream>
using namespace std;
#define ll long long
const ll mod = 1e9+7;
ll p[100005],pp[100005];
ll fac[100005],inv[100005];
void init()
{
inv[1]=1;
fac[1]=1;
fac[0]=1;
p[0]=1;
pp[0]=1;
p[1]=25;
pp[1]=26;
for(int i=2;i<=100000;i++)
{
fac[i]=fac[i-1]*i%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
p[i]=p[i-1]*25%mod;
pp[i]=pp[i-1]*26%mod;
}
}
ll q_pow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=ans*a%mod;
}
a=a*a%mod;
b=b/2;
}
return ans;
}
ll c(ll n,ll m)
{
return fac[n]*q_pow(fac[m]*fac[n-m]%mod,mod-2)%mod;
}
int main()
{
ll len,ans=0;
string t;
init();
cin>>t>>len;
int lens=t.size();
for(int i=lens;i<=len;i++)
{
ans=(ans+((c(i-1,lens-1)*p[i-lens]%mod)*pp[len-i])%mod)%mod;
// cout<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}