A - 串

思路:这是一道递推的题目

假设我们已经知道了当长度为 的时候我们的串中的子序列 us 的长度为 当 n 变为 n + 1 的时候我们在原来的基础之上我们有多出来一个空,那么这个时候我们只要考虑这个空我们要怎么填才好呢

梳理题意

首先我们先理一下 到底是什么,据题意, 也就是存在 s 在 u 后面的所有情况。OK 下面我们来看看 是啥。

开始构造

  1. 我们多出来的那位随便填个啥,因为我们的 是无论如何都成立的,所以说,在这种情况下我们就有 26 个可能的结果
  2. 那么我们前 位都不行呢,这样我们最后一位只有一个选择 ,我们填完之后前面又有限定条件了,前面的 位至少存在一个 且在 的前面不能存在 (如果存在,就是在 中了) 那么我们第二个的情况就是

综合上面我们的

答案要求我们求长度小于等于 n 字符串的所有可能性的,所以我们在分别加上去就可以了。

AC代码

#include<iostream>
using namespace std;

#define ll long long
//#define LOCAL
#define DEBUG

const int N = 1e6+10;
ll F[N];
const ll MOD = 1e9+7;
ll Q_power(ll a, ll b){
    ll res = 1;
    while(b){
        if(b & 1)   res = (res * a) % MOD;
        b >>= 1;
        a = (a * a) % MOD;
    }
    return res;
}


int main(){
    #ifdef LOCAL
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    ll res = 1;
    F[2] = 1;
    int n ; cin>>n;
    for(int i = 3 ; i <= n ; i ++ ){
        F[i] = (F[i-1] * 25 % MOD+ Q_power(26,i-1)) % MOD;
        F[i] -= Q_power(25,i-1);
        if(F[i] < 0) F[i] += MOD;
        res = (res + F[i]) % MOD;
    }
    cout<<res<<endl;
    return 0;
}