社区讨论

求助写挂的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 条回复,欢迎继续交流。

正在加载回复...