[ABC358E] Alphabet Tiles
[ABC358E] Alphabet Tiles
题目考察:组合数学,动态规划。
题目简述:
给你一个数
-
- 设一序列
\{p_{26}\} 的p_i 为在大写字母中第i 组字母,如p_1 为 A,p_5 为 E 等,则\displaystyle \forall i\in[1,26],\sum_{j=1}^{|s|}[s_j=p_i]\le c_i 。
数据范围: -
1\le k\le 10^3 -
\forall i\in[1,26],0\le c_i\le 10^3 我们设
m=26 ,则若直接暴力枚举,则复杂度为\Theta(m^k) ,根本无法接受。
考虑 dp。
我们设
我们的这个长度为
我们可以先预处理
再进行 dp。
由于
总体复杂度为
代码:
#include<bits/stdc++.h>
#define inl inline
#define reg register
#define int long long
#define fst ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define rep(i,x,y) for(reg int i=x;i<=y;++i)
#define per(i,x,y) for(reg int i=x;i>=y;--i)
#define endl '\n'
#define INF 1e16
#define pb push_back
#define fi first
#define se second
#define lcm(x,y) x/__gcd(x,y)*y
#define ull unsigned long long
using namespace std;
const int N=1005,M=35,MOD=998244353;
int c[M],f[N],dp[N][N];
signed main(){
fst;
reg int n,ans=0,ret=0;
cin>>n;
rep(i,1,26){
cin>>c[i];
ret+=c[i];
}
n=min(n,ret);
f[0]=dp[1][1]=1;
rep(i,2,n+1)
rep(j,1,i) dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%MOD;
rep(i,1,26)
per(j,n,1)
rep(k,max(0ll,j-c[i]),j-1) (f[j]+=f[k]*dp[j+1][k+1]%MOD)%=MOD;
rep(i,1,n) (ans+=f[i])%=MOD;
cout<<ans;
return 0;
}