Educational Codeforces Round 116 (Rated for Div. 2) E. Arena
Posted solemntee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 116 (Rated for Div. 2) E. Arena相关的知识,希望对你有一定的参考价值。
d
p
[
i
]
[
j
]
[
k
]
dp[i][j][k]
dp[i][j][k]表示最大值为
i
i
i长度为
j
j
j小于
j
−
1
j-1
j−1的数字有
k
k
k个
考虑一轮之后状态变为
d
p
[
i
−
(
j
−
1
)
]
[
j
−
k
]
[
.
.
.
]
dp[i-(j-1)][j-k][...]
dp[i−(j−1)][j−k][...],故转移为
d
p
[
i
]
[
j
]
[
k
]
=
∑
(
C
j
k
∗
(
j
−
1
)
k
∗
d
p
[
i
−
(
j
−
1
)
]
[
j
−
k
]
[
l
]
)
dp[i][j][k]=\\sum(C^k_j*(j-1)^k*dp[i-(j-1)][j-k][l])
dp[i][j][k]=∑(Cjk∗(j−1)k∗dp[i−(j−1)][j−k][l])
发现
k
k
k和转移无关直接滚动。
#include<bits/stdc++.h>
using namespace std;
int dp[505][505];
const int mod=998244353;
long long poww(long long a,long long b)
{
long long t=1;
if(b==0)return 1;
while(b>1)
{
if(b%2==1)t=(t*a)%mod;
a=a*a%mod;
b/=2;
}
return a*t%mod;
}
long long P1[1005],P2[1005];
void init()
{
P1[0]=1;
P2[0]=1;
for(int i=1;i<=505;i++)P1[i]=(P1[i-1]*i)%mod;
for(int i=1;i<=505;i++)P2[i]=(P2[i-1]*poww(i,mod-2))%mod;
}
int main()
{
init();
int n,x;
scanf("%d%d",&n,&x);
for(int i=1;i<=x;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<j;k++)
{
if(j==1)dp[i][j]+=1;
else if(j==i&&k!=j-1)continue;
else if(j>i)continue;
else
{
dp[i][j]=(dp[i][j]+poww(j-1,k)*P1[j]%mod*P2[k]%mod*P2[j-k]%mod*dp[i-j+1][j-k])%998244353;
}
}
///
// for(int i=1;i<=x;i++)
// for(int j=1;j<=n;j++)
// for(int k=0;k<j;k++)
// {
// printf("%d %d %d %lld\\n",i,j,k,dp[i][j][k]);
// }
long long ans=0;
for(int i=1;i<=x;i++)
{
ans=(ans+dp[i][n])%998244353;
}
printf("%lld",((poww(x,n)-ans)%mod+mod)%mod);
return 0;
}
以上是关于Educational Codeforces Round 116 (Rated for Div. 2) E. Arena的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33