AtCoder Beginner Contest 171 F.Strivore

AtCoder Beginner Contest 171 F.Strivore

题目链接
AtCoder Beginner Contest 171 F.Strivore_第1张图片
简单的组合数学~
我们首先可以确实最终的字符串有几个字符,那么我们每次可以挑 i i i 个位置,答案即为 C s u m i C_{sum}^i Csumi,那对这 i i i 个位置,每个位置都有 25 25 25 个选择,答案即为 2 5 i 25^i 25i,两个相乘即可,AC代码如下:

#include
using namespace std;
typedef long long ll;
const int N=2e6+5;
const ll mod=1e9+7;
ll F[N],I[N];
ll power(ll a,ll b){return b?power(a*a%mod,b/2)*(b%2?a:1)%mod:1;}
ll f(ll a,ll b)//快速乘
{
    ll k=0;
    while(b)
    {
        if(b&1) k=(k+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return k;
}

void init(){//预处理算组合数
    F[0]=1;
    ll s=1;
    for(int i=1;i<=N;i++){
        s=f(s,i);
        F[i]=s;
    }
    I[N]=power(F[N],mod-2);
    for(int i=N;i--;){
        I[i]=f(I[i+1],i+1);
    }
}

ll C(ll n, ll k){
    return f(f(F[n],I[n-k]),I[k]);
}

main(){
    init();
    ll k;
    string s;
    cin>>k>>s;
    ll len=s.size(),sum=k+len,ans=0;
    for(ll i=len;i<=sum;i++) ans=(ans+C(sum,i)*power(25,sum-i))%mod;
    cout<<ans;
}

你可能感兴趣的:(数论,思维,AtCoder)