2021牛客寒假算法基础集训营1 补题报告

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;
}

上一篇:刺客信条——ezio(艾吉奥)的演讲


下一篇:控制器UserController方法类实现