A - 串
思路:这是一道递推的题目
假设我们已经知道了当长度为 的时候我们的串中的子序列 us 的长度为 当 n 变为 n + 1 的时候我们在原来的基础之上我们有多出来一个空,那么这个时候我们只要考虑这个空我们要怎么填才好呢
梳理题意
首先我们先理一下 到底是什么,据题意, 也就是存在 s 在 u 后面的所有情况。OK 下面我们来看看 是啥。
开始构造
- 我们多出来的那位随便填个啥,因为我们的 是无论如何都成立的,所以说,在这种情况下我们就有 26 个可能的结果
- 那么我们前 位都不行呢,这样我们最后一位只有一个选择 ,我们填完之后前面又有限定条件了,前面的 位至少存在一个 且在 的前面不能存在 (如果存在,就是在 中了) 那么我们第二个的情况就是
综合上面我们的
答案要求我们求长度小于等于 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; }