题解:P12285 [蓝桥杯 2024 国 Python A] 药剂
Solution
本题的含义是,对于所有的方案最终药水的权值求和。
设全集
对于一种局面,他最终的药水魔法值一定可以写成
而对所有可能的方案求和后,答案一定也可以写成
因此我们只需要能够算出,每个集合能在多少种方案中得出即可。
考虑 DP。设
我们只能丢弃掉最终不要的药品,以及合并需要的药品。
很容易
剩下的问题就是:如何求出
总体复杂度
注:我最开始用了二十分钟去想
ヾ(。`Д´。)ノ彡
#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=3000+10;
int n,ans,a[MAXN],MOD,dp[MAXN][MAXN],mul[MAXN];
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>MOD;
dp[1][1]=1;
ffor(i,2,n) ffor(j,1,i) dp[i][j]=((i-j)*(i-1)*dp[i-1][j]+j*(j-1)/2*dp[i-1][j-1])%MOD;
mul[0]=1;
ffor(i,1,n) {
cin>>a[i];
roff(j,n,1) mul[j]=(mul[j]+mul[j-1]*a[i])%MOD;
}
ffor(i,1,n) ans=(ans+mul[i]*dp[n][i])%MOD;
cout<<ans;
return 0;
}