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\%) 的测试数据,(nleq 4)。
对于 (40\%) 的测试数据,(nleq 100)。
对于 (60\%) 的测试数据,(nleq 10000000)。
对于另外 (20\%) 的测试数据,保证(s)只由(a)组成。
对于 (100\%) 的测试数据,(2leq nleq 10^{18},1leq|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}-last 25ast 26^{n-l-1})
友情提醒:三年( ext{OI})一场空,不开( ext{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;
}