为什么爆零?
查看原帖
为什么爆零?
172205
myj128128楼主2022/11/25 17:10
//#pragma GCC optimize("Ofast",3,"inline")
#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define m_p make_pair
#define y1 ygftgfgcdtfgxffgx
#define y2 yfdsesgvtyghftfvv
#define x1 xvyr6cf6fgcfgf676
#define x2 xcr6rfc5r66y6r6fr
#define up_bound upper_bound
#define low_bound lower_bound
#define next_per next_permutation
#define pb push_back
#define i_to_s to_string
typedef priority_queue<int> p_queue;
typedef priority_queue<int, vector<int>, greater<int> > min_p_queue;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
int mon[20]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ll gcd(ll x,ll y){return ((y==0)?x:gcd(y,x%y));}
inline int read(){
    char ch=getchar();int num=0;bool flag=false;
    while(ch<'0'||ch>'9'){if(ch=='-')flag=true;ch=getchar();}
    while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();}
    return flag?-num:num;
}
int n,m,k;
const int mod=998244353; 
ll v[50];
ll dp[50][1<<18];
ll mask;
int dfs(int step,ll var){
//	cout<<step<<' '<<var<<'\n';
	if(dp[step][mask]!=-1)return dp[step][mask];
	if(step==n){
		if(bitset<64>(mask).count()<=k){
			dp[step][mask]=var;
			return dp[step][mask];
		}else return dp[step][mask]=-2;
	}
	ll sum=0;bool flag=0;
	for(int i=0;i<=m;i++){
		ll mas=mask;
		mask=mask+(1<<i);
		ll va=dfs(step+1,(var*v[i])%mod);
		if(va>=0){
			sum+=va;
			flag=1;
			sum%=mod;
		}
		mask=mas;
	}
	if(flag){
		dp[step][mask]=sum;
	}else dp[step][mask]=-2;
	return dp[step][mask];
}
void solve(){
	cin>>n>>m>>k;
	for(int i=0;i<=m;i++){
		cin>>v[i];
	}mask=0;
	memset(dp,-1,sizeof dp);
	cout<<dfs(0,1);
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int t;
	t=1;
	while(t--)
		solve();
	return 0;
}

2022/11/25 17:10
加载中...