题目传送门:http://uoj.ac/problem/94

  这是一道集合幂级数的入门题目。我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现,$h_S=2^{size_S}$,其中$size_S$为点集$S$的极大生成子图内的边数。特殊的,$f_{\o}=g_{\o}=0$。

  定义集合幂级数的乘法为子集卷积,考虑集合幂级数$h$和$g$的关系,我们可以得到

    $$h=1+\sum_{k \geq 1}\frac{g^k}{k!}=1+e^h$$

  因此可得

    $$g=\ln{(1+h)}$$

  我们再记$f_S$为点集$S$的生成子图的价值和,可得到

    $$f=1+\sum{k \geq 1}\frac{g^k}{k!}k!=\frac{1}{1-g}$$

  计算集合幂级数的对数和逆时,因为我们将乘法定义为子集卷积,所以可以将其映射成集合占位幂级数$f_{|S|,S}$后,在将每个集合对应的位看作形式幂级数再暴力求解。

  代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define mod 998244353
#define Mod1(x) (x>=mod?x-mod:x)
#define Mod2(x) (x<0?x+mod:x)
#define ll long long
inline ll read()
{
ll x=; char c=getchar(),f=;
for(;c<''||''<c;c=getchar())if(c=='-')f=-;
for(;''<=c&&c<='';c=getchar())x=x*+c-'';
return x*f;
}
inline void write(ll x)
{
static int buf[],len; len=;
if(x<)x=-x,putchar('-');
for(;x;x/=)buf[len++]=x%;
if(!len)putchar('');
else while(len)putchar(buf[--len]+'');
}
inline void writeln(ll x){write(x); putchar('\n');}
inline void writesp(ll x){write(x); putchar(' ');}
int f[][(<<)+],g[][(<<)+];
int cnt[(<<)+],inv[];
int x[],y[];
int n,m;
inline ll power(ll a,ll b)
{
ll ans=;
for(;b;b>>=,a=a*a%mod)
if(b&)ans=ans*a%mod;
return ans;
}
inline void fwt(int* a,int n)
{
for(int i=;i<n;i<<=)
for(int j=;j<n;j+=(i<<))
for(int k=j;k<j+i;k++)
a[k+i]=Mod1(a[k+i]+a[k]);
}
inline void ifwt(int* a,int n)
{
for(int i=;i<n;i<<=)
for(int j=;j<n;j+=(i<<))
for(int k=j;k<j+i;k++)
a[k+i]=Mod2(a[k+i]-a[k]);
}
int main()
{
n=read(); m=read();
for(int i=;i<m;i++)
x[i]=read()-,y[i]=read()-;
for(int i=;i<<<n;i++)
cnt[i]=cnt[i>>]+(i&);
for(int i=;i<<<n;i++){
int tot=;
for(int j=;j<m;j++)
if((i&(<<x[j]))&&(i&(<<y[j])))++tot;
f[cnt[i]][i]=power(,tot);
}
for(int i=;i<=n;i++)
fwt(f[i],<<n);
for(int i=;i<=n;i++)
inv[i]=power(i,mod-);
for(int i=;i<=n;i++){\\求ln
for(int k=;k<i;k++)
for(int j=;j<<<n;j++)
g[i][j]=(g[i][j]+(ll)k*g[k][j]%mod*f[i-k][j])%mod;
for(int j=;j<<<n;j++)
g[i][j]=(f[i][j]+(ll)(mod-inv[i])*g[i][j])%mod;
}
memset(f,,sizeof(f));
for(int i=;i<<<n;i++)
f[][i]=;
for(int i=;i<=n;i++)\\求逆
for(int k=;k<i;k++)
for(int j=;j<<<n;j++)
f[i][j]=(f[i][j]+(ll)f[k][j]*g[i-k][j])%mod;
ifwt(f[n],<<n);
writeln(f[n][(<<n)-]);
return ;
}

uoj94

【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)的更多相关文章

  1. 【集训队互测2015】Robot

    题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...

  2. BZOJ3938 & UOJ88:[集训队互测2015]Robot——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3938 http://uoj.ac/problem/88 小q有n只机器人,一开始他把机器人放在了一 ...

  3. 【loj2461】【2018集训队互测Day 1】完美的队列

    #2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...

  4. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  5. 洛谷 P4463 - [集训队互测 2012] calc(多项式)

    题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...

  6. UOJ#191. 【集训队互测2016】Unknown

    题意:维护一个数列,每个元素是个二维向量,每次可以在后面加一个元素或者删除一个元素.给定P(x,y),询问对于[l,r]区间内的元素$S_i$,$S_i \times P$的最大值是多少. 首先简单地 ...

  7. UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ191.html 题目传送门 - UOJ191 题意 自行移步集训队论文2016中罗哲正的论文. 题解 自行 ...

  8. uoj #190. 【集训队互测2016】消失的源代码 提交答案题

    Test 1: 发现是一个字母表的映射 把 \('a' \to 'z'\) 打进去找出映射就好了QAQ . Test 2: 求助 \(dalao\) 得知的点.. 答案是 : \(2016x^2 + ...

  9. LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)

    题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...

随机推荐

  1. java+上传大文件

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  2. 数据质量、特征分析及一些MATLAB函数

    MATLAB数据分析工具箱 MATLAB工具箱主要含有的类别有: 数学类.统计与优化类.信号处理与通信类.控制系统设计与分析类.图像处理类.测试与测量类.计算金融类.计算生物类.并行计算类.数据库访问 ...

  3. 有关IP和子网掩码的总结

    从之前写的那个概括的文章之后,具体细节知识我也不知道写啥子,最近忙于毕业论文和考证,所以就总结一下这方面的知识,本篇的话就先从IP说起. IP这方面有IPv4和IPv6这两方面的内容,这里就只说IPv ...

  4. Windows10系统Python2.7通过Swig调用C++过程

    我用的 python版本是2.7.12: Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit ...

  5. 转发表(MAC表)、ARP表、路由表总结

    原文:https://cloud.tencent.com/developer/article/1173761 转发表(MAC表).ARP表.路由表总结 我是东东东   发表于我是东东强订阅 1.5K ...

  6. fastclick.js

    <script src="//cdn.bootcss.com/fastclick/1.0.6/fastclick.js"></script> //<s ...

  7. centos7:ssh免密登陆设置及常见错误

    目录 一.免密登录设置 二.常见错误 三.CentOS7再ssh-copy-id时的错误 一.免密登录设置 1.使用root用户登录,进入到目录/root/.ssh 2.执行命令:ssh-keygen ...

  8. hadoop(二MapReduce)

    hadoop(二MapReduce) 介绍 MapReduce:其实就是把数据分开处理后再将数据合在一起. Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理.可以进行拆分的前提是这 ...

  9. 【转载】MyBatis批量插入数据(insert)

    介绍:MyBatis批量插入数据,原理就是在xml文件中添加 foreach 语句,然后MyBatis自动在values后面添加多个括号: XML文件如下: <?xml version=&quo ...

  10. LeetCode 答案(python)1-17

    1.给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], targe ...