求助写挂的50分dp
查看原帖
求助写挂的50分dp
104292
YellowBean_Elsa楼主2021/12/14 13:26
//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;
}
2021/12/14 13:26
加载中...