CF135 [E]
Key Observation:
若称一个前缀是
\texttt{distinct prefix} 当且仅当其中所有字符互不相同、且它是极长的满足这个性质的前缀,\texttt{distinct suffix} 同理,则S 中最长的弱子串长度f(S) = |S| - \min(|\texttt{distinct prefix}(S)|, |\texttt{distinct suffix}(S)|) 。
(以下将上面的定义简称为
考虑证明这个结论:
考虑最长的
于是肯定是枚举
考虑容斥,
枚举
若
否则中间重合部分方案数
复杂度
inline int Sqr(int x){ return 1ll*x*x%p; }
inline int P(int &x,int y){ return (x+=y)>=p&&(x-=p), x; }
inline int Pow(ll bs,ll b,ll rs = 1){ for(;b;bs=bs*bs%p,b>>=1) if(b&1) rs=rs*bs%p; return rs; }
inline int S(int a1,int d,int n){ return d==1 ? 1ll*a1*n%p : 1ll*a1*(Pow(d,n)-1+p)%p*Pow((d-1+p)%p,p-2)%p; }
int K, w, fac[N], invf[N];
inline int A(int n,int m){ return 1ll*fac[n]*invf[n-m]%p; }
__attribute__((constructor)) static void Prepare(){
fac[0] = fac[1] = invf[0] = invf[1] = 1;
for(int i=2;i<N;++i) fac[i] = 1ll*fac[i-1]*i%p;
invf[N-1] = Pow(fac[N-1], p-2);
for(int i=N-1;i>2;--i) invf[i-1] = 1ll*invf[i]*i%p;
}
inline int Calc(int n){
int res = S(K, K, n);
for(int i=1;i<=min(K,n-1);++i)
P(res, 1ll*Pow(K,n-i)*Sqr(A(K,i))%p);
for(int i=n;i<=K;++i)
P(res, 1ll*A(K,i-n)*Sqr(A(K-(i-n),n))%p);
return res;
}
main(){
scanf("%d %d", &K, &w);
printf("%d\n", (Calc(w)-Calc(w-1)+p)%p);
}