2.8
Unnamed114514 · · 休闲·娱乐
A. Gym102956B Beautiful Sequence Unraveling
注意到
注意到直接钦定有多少个值这件事情是困难的,但是至多比较容易,我们定义
现在我们把问题转化为求
考虑容斥,枚举最后一个不合法的位置
因此有:
乍一看这个是
注意到其实幂的乘除可以转化为指数的加减,因此把式子转化为:
时间复杂度
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=405;
int n,k,p,f[N][N],g[N],h[N][N][N],pw[N][N],ipw[N][N],b[N],a[N];
int qpow(int a,int b){
int s=1;
while(b){
if(b&1) s=s*a%p;
a=a*a%p,b>>=1;
}
return s;
}
int C(int n,int m){
return !m?1:C(n-1,m-1)*n%p*qpow(m,p-2)%p;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>k>>p;
for(int i=1;i<=min(n,k);++i){
ipw[i][0]=pw[i][0]=1;
for(int j=1;j<=n;++j) ipw[i][j]=qpow(pw[i][j]=pw[i][j-1]*i%p,p-2);
}
for(int i=1;i<=n;++i) for(int j=1;j<=min(n,k);++j){
for(int t=1;t<=j;++t) f[i][j]=((f[i][j]+pw[t][i]*h[i-1][j-t+1][t]-pw[t][i]*h[i-1][j-t][t]%p-pw[t-1][i]*h[i-1][j-t+1][t-1]+pw[t-1][i]*h[i-1][j-t][t-1])%p+p)%p;
f[i][j]=(pw[j][i]-f[i][j]+p)%p;
for(int t=1;t<=min(n,k);++t) h[i][j][t]=(h[i-1][j][t]+f[i][j]*ipw[t][i])%p;
}
for(int i=1;i<=min(n,k);++i) b[i]=f[n][i];
for(int i=1;i<=min(n,k);++i){
a[i]=b[i];
for(int j=1;j<i;++j) a[i]=(a[i]-C(i,j)*a[j]%p+p)%p;
}
int ans=0;
for(int i=1;i<=min(n,k);++i) ans=(ans+C(k,i)*a[i])%p;
cout<<ans<<endl;
return 0;
}