Nowcoder9981A.串(排列组合)

链接:https://ac.nowcoder.com/acm/contest/9981/A
来源:牛客网

长度不超过nnn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对109+710^9+7109+7取模。
所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。
例如,"unoacscc"包含子序列"us",但"scscucu"则不包含子序列"us"
 
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
const int mod=1e9+7;
int n;
//一个长度为n的字符串
//包含一个us即可
//在已经有一个u的情况下,后面要有s
//枚举u的位置
//保证前面不包含u
//pow(25,i-1)*(pow(26,n-i)-pow(25,n-i))
long long c26[maxn];
long long c25[maxn];
long long f26[maxn];
long long f25[maxn];
int main () {
    scanf("%d",&n);
    long long ans=0;
    f26[0]=f25[0]=1;
    for (int i=1;i<=n;i++) {
        f26[i]=f26[i-1]*26;
        f26[i]%=mod;
        f25[i]=f25[i-1]*25;
        f25[i]%=mod;
        c26[i]=c26[i-1]+f26[i];
        c25[i]=c25[i-1]+f25[i];
        c26[i]%=mod;
        c25[i]%=mod;
    }
    for (int i=1;i<=n;i++) {
        ans+=f25[i-1]*(c26[n-i]-c25[n-i]+mod)%mod;
        ans%=mod;
    }
    printf("%lld\n",ans);
} 

 

posted @ 2021-02-01 21:39  zlc0405  阅读(128)  评论(0编辑  收藏  举报