A-串
题目描述
长度不超过nn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对
1
e
9
+
7
1e9+7
1e9+7取模。
所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。
例如,“unoacscc"包含子序列"us”,但"scscucu"则不包含子序列"us"
输入
一个正整数 n , ( 2 ≤ n ≤ 1 0 6 ) n,(2\le n\le10^6) n,(2≤n≤106)
输出
一个正整数,为满足条件的字符串数量对 1 0 9 + 7 10^9+7 109+7取模的值
实例
样例1输入
2
样例1输出
1
解析
定义dp[i]为长度为i且包含子序列"us"的字符串的数量。
那么对于长度i+1而言,包含子序列"us"的字符串有两类:
①前i个字符已经包含了子序列"us",后面接任意一个字符。数量为
d
p
[
i
]
∗
26
dp[i]*26
dp[i]∗26。
②前i个字符包含字母u,但不包含子序列"us"。后面再接一个字符’s’即可。数量为
2
6
i
−
2
5
i
−
d
p
[
i
]
26^i-25^i-dp[i]
26i−25i−dp[i]。
两者相加即为dp[i+1]
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iomanip>
using namespace std;
#define LL long long
#define uLL unsigned long long
#define endl '\n'
const LL MOD = 1e9 + 7;
const LL INF = 0x3f3f3f3f;
const int N = 1e5 + 7;
const int MAXN = 107;
const double EPS = 1e-6;
const double PI = acos(-1);
using namespace std;
LL ksm(LL a, LL b, LL p = MOD)
{
LL ans = 1;
while (b)
{
if (b & 1)
{
ans = ans * a % p;
}
b >>= 1;
a = a * a % p;
}
return ans;
}
LL dp[1000007];
int main()
{
dp[2] = 1;
int n;
cin >> n;
for (int i = 3; i <= 1e6; ++i)
{
dp[i] = (ksm(26, i - 1) - ksm(25, i - 1) + 25 * dp[i - 1]+MOD) % MOD;
}
LL ans = 0;
for (int i = 1; i <= n; ++i)
{
ans = (ans + dp[i]) % MOD;
}
cout << ans << endl;
return 0;
}