1 条题解
-
-1
0分做法
-
不取模即可
-
不开
long long。 -
不使用
freopen即可。
80分做法
数组开小即可。
满分做法
设计 表示在 的 到 位中,给 个 中元素赋了值, 中到现在为止有 个 ,第 位相当于加了 次(包括 进上去的)。
现在考虑如何转移。枚举上一次用的 ,然后就比较显然了。
#include<bits/stdc++.h> #define int long long using namespace std; const int mod=998244353; int n,m,k,v[105][35],ans; int dp[110][35][35][35],C[35][35]; signed main() { std::ios::sync_with_stdio(0),cin.tie(0); cin>>n>>m>>k; for(int i=0; i<=m; ++i) { v[i][0]=1; cin>>v[i][1]; for(int j=2; j<=n; ++j) v[i][j]=v[i][j-1]*v[i][1]%mod; } C[0][0]=1; for(int i=1; i<=n; ++i) { C[i][0]=1; for(int j=1; j<=i; ++j) { C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod; } } for(int j=0; j<=n; ++j) { dp[0][j][j%2][j]=v[0][j]; } for(int i=1; i<=m; ++i) { for(int j=0; j<=n; ++j) { for(int l=0; l<=j; ++l) { for(int y=0; y<=j; ++y) { if(!dp[i-1][j][l][y])continue; for(int x=0; x+j<=n; ++x) { dp[i][j+x][l+(x+y/2)%2][x+y/2]=(dp[i][j+x][l+(x+y/2)%2][x+y/2]+dp[i-1][j][l][y]*v[i][x]%mod*C[j+x][x]%mod)%mod; } } } } } for(int l=0; l<=k; ++l) { for(int x=0; x<=n; ++x) { if(l+__builtin_popcount(x)-x%2<=k) ans=(ans+dp[m][n][l][x])%mod; } } cout<<ans<<"\n"; return 0; } -
- 1
信息
- ID
- 475
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 6
- 已通过
- 2
- 上传者