明天就是CTSC的DAY 2了qwq,晚上敲敲暴力攒攒RP,果断随便看了个题就是打暴力hhhhh

前50% O(3^N) 暴力没什么好说的,我们设F[S][s]为已经选了S集合中的点,并且这个集合中的点的最大独立集是s的方案数,最后统计完了乘上 n! 的逆元就好了。  (s肯定是S的一个子集,所以复杂度是 3^n)

然鹅中间的暴力分只会链。。。。。

首先如果n是奇数的话,那么最大独立集只可能是所有奇数点,所有这种情况下我们知道了选了的点的集合就知道独立集是什么了,所以可以直接 O(2^n) dp了。。。。

但是出题人并没有这么良心2333,这一个点的n在最后的数据里是偶数。。。。

考虑如果n是偶数的情况的话,独立集只可能是:全是奇数的点 或者 全是偶数的点 或者 ∑ [i是偶数] <=i的全是奇数的点 和 >i的全是偶数的点,这样的话我们先用 与求n是奇数的同样的方法 (钦定最大独立集是所有奇数点) 求出对于每个偶数i,最大独立集是<=i的奇数的点的答案,然后卷积合并一下就好啦,因为后面的全是偶数的点的集合可以看成是反向的全是奇数的点的集合。

合并的时候还要乘上一个组合数,因为两边元素之间的顺序还没有确定、

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=300005,ha=998244353;
inline int add(int &x,int y){ x+=y; if(x>=ha) x-=ha;}
inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha; return an;}
unordered_map<int,int> f[maxn];
unordered_map<int,int>:: iterator it;
int n,ci[35],m,uu,vv,BC[maxn],ans,M;
bool G[35][35],can[maxn][23];
inline int ADD(int S,int x){ return can[S][x]?(S|ci[x]):S;}
int g[maxn*4+5],jc[233],C[233][233]; inline void init(){
for(int i=0;i<ci[n];i++)
for(int j=0;j<n;j++) if(!(ci[j]&i)){
can[i][j]=1;
for(int o=0;o<n;o++) if((ci[o]&i)&&G[o][j]){
can[i][j]=0;
break;
} }
} inline void calc(){
ans=ans*(ll)ksm(jc[n],ha-2)%ha;
} inline void solve(){
f[0][0]=1; int all=ci[n]-1; for(int i=0;i<all;i++)
for(it=f[i].begin();it!=f[i].end();++it)
for(int j=0,S,to;j<n;j++) if(!(ci[j]&i)){
S=i|ci[j],to=ADD(it->first,j),M=max(M,BC[to]);
add(f[S][to],it->second);
} for(it=f[all].begin();it!=f[all].end();++it) if(BC[it->first]==M) add(ans,it->second);
} inline int get_line(int N){
memset(g,0,sizeof(g));
g[0]=1; int all=ci[N]-1; for(int i=0;i<all;i++) if(g[i])
for(int j=0;j<N;j++) if(!(ci[j]&i)){
if((j&1)&&!((i&ci[j-1])||(i&ci[j+1]))) continue; add(g[i|ci[j]],g[i]);
}
return g[all];
} inline void qwqwq(){
int o[23];
for(int i=2;i<=n;i+=2) o[i]=get_line(i);
add(ans,o[n]),add(ans,o[n]); for(int i=2;i<n;i+=2) add(ans,o[i]*(ll)o[n-i]%ha*C[n][i]%ha);
} int main(){
ci[0]=1;
for(int i=1;i<=20;i++) ci[i]=ci[i-1]<<1;
jc[0]=1;
for(int i=1;i<=20;i++) jc[i]=jc[i-1]*(ll)i%ha;
C[0][0]=1;
for(int i=1;i<=75;i++){
C[i][0]=1;
for(int j=1;j<=i;j++) add(C[i][j],C[i-1][j-1]),add(C[i][j],C[i-1][j]);
} scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d",&uu,&vv),G[uu-1][vv-1]=G[vv-1][uu-1]=1; if(n<=17){
for(int i=1;i<ci[n];i++) BC[i]=BC[i^(i&-i)]+1;
init(),solve();
}
else if(n&1) ans=get_line(n);
else qwqwq(); calc(); printf("%d\n",ans);
return 0;
}

  

「PKUWC 2018」随机算法 (60分部分分做法)的更多相关文章

  1. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  2. 「PKUWC 2018」随机算法 (第二版,正解做法)

    上一版貌似是打了 O(3 ^ N) 暴力和 一条链的情况,得了60分.... 第一次做的时候光想练一练暴力...就没去想正解,谁知道正解比暴力好写不知道多少,mmp 设 f(S) 为 选集合S中的点可 ...

  3. loj2540 「PKUWC 2018」随机算法

    pkusc 快到了--做点题涨涨 rp. 记 \(f(S,i)\) 表示 \(S\) 这个集合是决计不能选的(要么属于独立集,要么和独立集相连),或称已经考虑了的,\(i\) 表示此集合对应的最大独立 ...

  4. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  5. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

  6. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  7. loj2538 「PKUWC 2018」Slay the Spire

    pkusc 快到了--做点题涨涨 rp. ref我好菜啊QAQ. 可以发现期望只是一个幌子.我们的目的是:对于所有随机的选择方法(一共 \(\binom{2n}{m}\)种),这些选择方法都最优地打出 ...

  8. LOJ #2537. 「PKUWC 2018」Minimax (线段树合并 优化dp)

    题意 小 \(C\) 有一棵 \(n\) 个结点的有根树,根是 \(1\) 号结点,且每个结点最多有两个子结点. 定义结点 \(x\) 的权值为: 1.若 \(x\) 没有子结点,那么它的权值会在输入 ...

  9. 「PKUWC 2018」Minimax

    传送门:Here 一道线段树合并好题 如果要维护点$ x$的信息,相当于合并$ x$的两棵子树 对于这题显然有:任何叶子节点的权值都可能出现在其祖先上 因而我们只需要在线段树合并的时候维护概率即可 我 ...

随机推荐

  1. 3dMax,Maya与FBX

    3DMax下载地址(包含安装教程与注册方法):http://www.3d66.com/popsoft_1.html 3DMax已经自带导出为fbx格式的功能,所以无需安装fbx插件 Maya下载地址( ...

  2. python multiprocessing.Pool 中map、map_async、apply、apply_async的区别

    multiprocessing是python的多进程库,multiprocessing.dummy则是多线程的版本,使用都一样. 其中都有pool池的概念,进程池/线程池有共同的方法,其中方法对比如下 ...

  3. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

  4. Wordpress 为用户或角色 role 添加 capabilities(权限)

    首先查看角色具有哪些权限: $admin_role_set = get_role( 'administrator' )->capabilities; $author_role_set = get ...

  5. kafak基本操作

    创建topic bin/kafka-topics.sh --create --zookeeper 192.168.1.81:2181 --replication-factor 3 -partition ...

  6. jquery实现各种实例

    1.正反选实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. awk学习笔记

    1. 数据格式 id1,n1 id2,n2 ... 要对每个id进行一个n的加和 cat file1 | awk -F"," '{if(n[$1]>0){n[$1]=n[$1 ...

  8. HDU 4474 Yet Another Multiple Problem ( BFS + 同余剪枝 )

    没什么巧办法,直接搜就行. 用余数作为每个节点的哈希值. #include <cstdio> #include <cstring> #include <cstdlib&g ...

  9. 【bzoj4894】天赋 矩阵树定理

    题目描述 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在学习了另一个天赋 ...

  10. 2017-7-18-每日博客-关于Linux基本命令CnetOS7系统基本操作命令.doc

    1.root/下 cat  anaconda-ks.cfg 确定是否装base软件组 yum groupinstall base  安装base组ifconfig 命令就可以使用了或者使用ip add ...