「WC2018」州区划分(FWT)
我去弄了一个升级版的博客主题,比以前好看多了。感谢 @Wider
不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了。
洛谷上不开 \(O_2\) 根本过不去,自带大常数被卡到 \(15\) 分。。。
首先题了读了很久,发现一个州的集合可以不连通。。。
我们可以 \(O(n^22^n)\) 检验每一个状态是否满足条件,用并查集即可。
\(f[S]\) 为状态 \(S\) 时的满意度之和,\(g[S]\) 当状态 \(S\) 为合法状态时为 \(sum_S^p\)
\[f_S=\frac {1}{sum_S^p}\sum_{T\subset S}f_Tg_{S-T}\]
然后这个东西可以用 \(or\) 卷积的 \(FWT\) 优化。我觉得出题人特地把数据范围出这么大应该是卡 \(O(3^n)\) 的枚举子集。
\(Code\ Below:\)
// luogu-judger-enable-o2
#include
using namespace std;
const int mod=998244353;
int n,m,p,lim,w[30],d[30],e[30],fa[30],bin[30],cnt[1<<21],sum[1<<21],inv[1<<21],f[22][1<<21],g[22][1<<21];
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int sub(int x,int y){return x-y<0?x-y+mod:x-y;}
inline int mul(int x,int y){return 1ll*x*y-1ll*x*y/mod*mod;}
inline int fpow(int a,int b){
int ret=1;
for(;b;b>>=1,a=mul(a,a))
if(b&1) ret=mul(ret,a);
return ret;
}
inline void FWT(int *f,int n){
for(int len=1;len>1]+(i&1);
int x,y;
for(int i=0;i