只挂了 subtask2 第一个点。用之前的暴力改的,暴力过了这个包。球球老哥看一看。/kel 拍了好久没拍出来。
或者有没有路过的管理帮忙给个数据。/kel
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define ull unsigned long long
#define maxn 200005
#define put() putchar('\n')
#define Tp template<typename T>
#define Ts template<typename T,typename... Ar>
using namespace std;
Tp void read(T &x){
int f=1;x=0;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
x*=f;
}
namespace Debug{
Tp void _debug(char* f,T t){cerr<<f<<'='<<t<<endl;}
Ts void _debug(char* f,T x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);}
#define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__)
}using namespace Debug;
#define fi first
#define se second
#define mk make_pair
const int mod=998244353;
ll power(ll x,int y=mod-2,int p=mod) {
ll sum=1;x%=p;
while (y) {
if (y&1) sum=sum*x%p;
x=x*x%p;y>>=1;
}
return sum;
}
int f[maxn],g[maxn];
int n,m,len;
int s[maxn],b[maxn],cnt,suf[maxn],pw[maxn],ans,nex[maxn];
void add(int &x,int y) {x=(x+y)%mod;}
struct node {
int l,d,x;
}c[maxn];
int sum[maxn][21];
int tot;
signed main(void){
int i,j;
read(n);read(m);read(len);
for (i=1;i<=len;i++) read(s[i]);
for (j=0,i=2;i<=len;i++) {
while (j&&s[j+1]!=s[i]) j=nex[j];
if (s[j+1]==s[i]) j++;
nex[i]=j;
}
int x=len;
// gdb(len,nex[len]);
while (nex[x]) x=nex[x],b[++cnt]=x;
int las=1;
reverse(b+1,b+1+cnt);
for (i=2;i<=cnt;i++) {
if (las<i&&abs(b[i]-b[i-1])==abs(b[las+1]-b[las])) ;
else {
++tot;
c[tot].x=b[las];
c[tot].l=i-las;c[tot].d=abs(b[i]-b[i-1]);
las=i;
}
}
if (las<=cnt) ++tot,c[tot].x=b[las],c[tot].l=cnt-las+1,c[tot].d=abs(b[las+1]-b[las]);
for (i=1;i<=tot;i++) if (c[i].d==0) c[i].d=1;
// for (i=1;i<=cnt;i++) gdb(i,b[i]);
// for (i=1;i<=tot;i++) gdb(c[i].x,c[i].l,c[i].d);
int res=power(m,len-1);
int invm=power(m);
for (pw[0]=1,i=1;i<=n;i++) pw[i]=pw[i-1]*invm%mod;
for (i=len;i<=n;i++) {
res=res*m%mod;
f[i]=pw[len]*(mod+1-suf[i-len])%mod;
for (j=1;j<=tot;j++) {
int tmp=max(i-len+c[j].x-c[j].d,0ll);
add(f[i],mod-(sum[i-len+c[j].x+c[j].d*(c[j].l-1)][j]-sum[tmp][j]+mod)*pw[i]%mod);
// for (j=1;j<=cnt;j++) add(f[i],mod-f[i-len+b[j]]*pw[len-b[j]]%mod);
}
g[i]=f[i]*res;
for (j=1;j<=tot;j++) sum[i][j]=(sum[i-c[j].d][j]+g[i])%mod;
suf[i]=(suf[i-1]+f[i])%mod;
}
for (i=1;i<=n;i++) add(ans,f[i]);
printf("%lld\n",ans);
return 0;
}
//i=begin && g++ $i.cpp -o $i -std=c++14 && ./$i