题目描述
小e即将要面临一场只有选择题的考试,但是临近考试了他还有好多题不会。小e只知道这次考试一共有n道题目,每道题都有k个选项,由前k个英文大写字母组成。于是他臆想了一个长度为m的字符串作为他的备选答案。为了让自己安心一点,他想要知道他臆想的字符串在所有的可能正确答案中作为子串出现的次数之和。由于总数可能很大,小e只想知道总数对998244353取模后的结果。
串中任意个连续的字符组成的序列称为该串的子串。
输入
单组测试数据。
第一行包含三个正整数k,n,m,分别代表选项的数量、题目的数量和小e臆想字符串的长度,第二行包含一个长度为m,只含有前k个英文大写字母的字符串,代表小e臆想字符串。
输出
输出一个整数代表总数对998244353取模后的结果。
样例输入
2 3 2
AA
样例输出
4
注释:由题可知总数为(n-m+1)*k^(n-m);由于数据太大会超时,要用快速幂求解。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=998244353;
string s;
ll quickpower(ll k,ll b,ll mod){
ll res=1;
while(b){
if(b&1)res=res*k%mod;
k=k*k%mod;
b>>=1;
}
return res;
}//快速幂模板(k^b%mod)
int main(){
ll k,n,m,a,b;
cin>>k>>n>>m;
cin>>s;
a=n-m+1;
b=n-m;
ll w=quickpower(k,b,mod);
cout<<((a%mod)*(w%mod))%mod<<endl;
}