数论|AtCoder Beginner Contest 171 F.Strivore

AtCoder Beginner Contest 171 F.Strivore 【数论|AtCoder Beginner Contest 171 F.Strivore】题目链接
数论|AtCoder Beginner Contest 171 F.Strivore
文章图片

简单的组合数学~
我们首先可以确实最终的字符串有几个字符,那么我们每次可以挑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<

    推荐阅读