[11.10模拟赛]T1

Description

\(W\)终于学会了魔术, 她迫不及待的想要给你展示一下,小\(W\)的魔术是这样的:
她可以删去一个字符串的任意一个连续子串(可以为空) , 然后把剩下的部分按顺序拼接成一个字符串。
\(W\)由于刚刚学会魔术, 她只能使用一次。
\(W\)还有一个特别喜欢的字符串\(s\),如果使用一次魔术之后剩下的字符串就是\(s\),小\(W\)就会对自己的魔术感到满意,但是并不是所有字符串可能让小\(W\)感到满意。
\(W\)想知道长度为\(n\)的只由小写字母组成的字符串中,无论小\(W\)如何使用魔法都不会满意的有多少个。

Input

第一行一个整数\(n\),表示字符串的长度。
第二行一个只包含小写字母的字符串\(s\)

Output

一行一个整数表示答案对\(998244353\)取模后的结果。

Sample Input

2
a

Sample Output

625

Data Constraint

对于 \(20\%\) 的测试数据,\(n\leq 4\)
对于 \(40\%\) 的测试数据,\(n\leq 100\)
对于 \(60\%\) 的测试数据,\(n\leq 10000000\)
对于另外 \(20\%\) 的测试数据,保证\(s\)只由\(a\)组成。
对于 \(100\%\) 的测试数据,\(2\leq n\leq 10^{18},1\leq|s|\leq 1000000\)
对于 \(100\%\) 的测试数据,\(|s|\leq n\)

Limit

\(1000ms\) \(512MB\)

Solution

正难则反。
设原来的字符串长度为\(n\),删之后的长度为\(l\)
那么原来的字符串总共有\(26^n\)中可能
我们往长度为\(l\)的字符串中插入长度为\(n-l\)的字符串可以保证合法(但不能保证重复)
长度为\(l\)的字符串前后总共有\(l+1\)的位置可以插入
其中第一个位置(第一个字母之前)有\(26^{n-l}\)中插法
之后的\(l\)个位置为了保证不和前面的重复,总有第一个位置的第一个字母不能和前面的重复,所以有\(25*26^{n-l-1}\)种插法
所以答案为\(26^n-26^{n-l}-l\ast 25\ast 26^{n-l-1}\)
友情提醒:三年\(\text{OI}\)一场空,不开\(\text{long long}\)见祖宗

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MOD 998244353
#define N 2000010
ll n, l;
char s[N];
inline ll read() {
	ll s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}
inline ll Pow(ll a, ll b) {
	if (b < 0) return 0; 
	ll ans = 1;
	while (b) {
		if (b % 2) (ans *= a) %= MOD;
		(a *= a) %= MOD;
		b >>= 1;
	}
	return ans;
}
int main() {
	
	freopen("magic.in","r",stdin);
	freopen("magic.out","w",stdout);
	n = read();
	scanf("%s", s + 1);
	l = strlen(s + 1);
	printf("%lld", (Pow(26, n) + MOD - Pow(26, n - l) + (MOD - l) * (25 * Pow(26, n - l - 1) % MOD)) % MOD);
	return 0;
}
posted @ 2019-11-10 08:28  Agakiss  阅读(245)  评论(0编辑  收藏  举报