wannafly 5-子序列

来源:互联网 发布:rar mac 破解版 编辑:程序博客网 时间:2024/06/05 10:06

题目链接


这道题就是组合数学

按照高中数学的排列组合原理


先选最后一个字符的位置,其前面的每个空位有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);}