这道题就是组合数学
按照高中数学的排列组合原理
先选最后一个字符的位置,其前面的每个空位有25种选法,后面的有26种选法
比如 a_b_c_ 有 25*25*26种选法
那么,暴力出最后一个字母的所有可能位置,然后计算有多少种情况,然后计算每种情况的种数
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+88;
const long long mod=1e9+7;
long long fac[N];
long long quick(long long n,long long k)//求n的k次方
{
long long ans=1;
while(k)
{
if(k&1) ans=(ans*n)%mod,k|=1;
k>>=1;
n=(n*n)%mod;
}
return ans;
}
long long C(long long n,long long m)//求排列组合
{
return fac[n]*quick(fac[m],mod-2)%mod*quick(fac[n-m],mod-2)%mod;
}
char str[N];
int main()
{
fac[0]=1;
long long n,ans=0;
scanf("%s",str);
scanf("%lld",&n);
for(long long i=1; i<=n; ++i)
fac[i]=i*fac[i-1]%mod; //求i的阶乘
long long m=strlen(str);
for(long long i=m; i<=n; ++i)
{
ans=(ans+C(i-1,m-1)*quick(25,i-m)%mod*quick(26,n-i)%mod)%mod;
}
printf("%lld\n",ans);
}