社区讨论
求助写挂的50分dp
P7961[NOIP2021] 数列参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lob63u2t
- 此快照首次捕获于
- 2023/10/29 15:46 2 年前
- 此快照最后确认于
- 2023/11/03 22:04 2 年前
CPP
//coder: YB-Elsa of Ahtohallan
#include<bits/stdc++.h>
#define fu(i,a,b) for(register int i = a, I = (b) + 1; i < I; ++i)
#define fd(i,a,b) for(register int i = a, I = (b) - 1; i > I; --i)
using namespace std;
typedef long long ll;
const int N=31;
const int M=112;
const int mod=998244353;
const int maxx=30*4096-1;
inline int read(){
int x=0;char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x;
}int n,m,k,ans;
int v[M];
int dp[maxx+1][N];
inline int num(int x){
int res=0;
fu(i,0,30)if(x&(1<<i))res++;
return res;
}
signed main(){
n=read(),m=read(),k=read();
fu(i,0,m)
v[i]=read();
dp[0][0]=1;
fu(i,1,n){
fu(j,0,maxx){
fu(c,0,m){
if(j>=(1<<c))dp[j][i]=(dp[j][i]+(ll)dp[j-(1<<c)][i-1]*v[c]%mod)%mod;
}
}
}fu(j,0,maxx){
if(num(j)<=k && dp[j][n])ans+=dp[j][n]%=mod;
}
printf("%lld\n",ans);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...