小学生图论题

Description

有一个点数为nnn的竞赛图,每条边的的方向等概率随机。
现在给出m" role="presentation" style="position: relative;">mmm条有向链,表示每条链上的边的有向边的方向都已被钦定。
保证一个点不会出现在两条给出的链中。
求该竞赛图强连通分量的期望个数。(答案模998244353998244353998244353)

Data Constrains

n,m≤105n,m≤105n,m\leq 10^5

Solution

首先竞赛图缩完强联通分量后的是一个拓扑序唯一的,类似一条链的拓扑图,可以把这条链上的每一条边看成一个分隔,分成了前后两个点集SSS,T" role="presentation" style="position: relative;">TTT,其中SSS和T" role="presentation" style="position: relative;">TTT之间的连边的方向都是由SSS连向T" role="presentation" style="position: relative;">TTT。相反的,如果在一个竞赛图中,点可以分成两个集合SSS,T" role="presentation" style="position: relative;">TTT,其中SSS和T" role="presentation" style="position: relative;">TTT之间的连边的方向都是由SSS连向T" role="presentation" style="position: relative;">TTT,那这在竞赛图缩完点后必定对应一个分隔。
可以看出强联通分量的数量即为分隔数+111,所以我们只需求出期望的分隔数即可。

于是我们可以将答案写成1+∑S,TΠx∈S y∈TPx,y" role="presentation" style="position: relative;">1+∑S,TΠx∈S y∈TPx,y1+∑S,TΠx∈S y∈TPx,y1+\sum_{S,T}\Pi_{x\in S\ y\in T}P_{x,y}其中Px,yPx,yP_{x,y}是xxx指向y" role="presentation" style="position: relative;">yyy的概率(由题意可知Px,y∈{0,1,12}Px,y∈{0,1,12}P_{x,y}\in \{0,1,\frac{1}{2}\})。

当mmm=0" role="presentation" style="position: relative;">000时,易得出Ans=1+∑n−1i=1Cin12i(n−i)Ans=1+∑i=1n−1Cni12i(n−i)Ans=1+\sum_{i=1}^{n-1}C_{n}^i{1\over 2}^{i(n-i)}。

那当mmm不等于0" role="presentation" style="position: relative;">000时,对于每一条给出的链,不难发现,这条链最终能分成前后两段,前一段属于SSS集,后一段属于T" role="presentation" style="position: relative;">TTT集,同时我们能够发现如果一条链上的所有边并非同时属于SSS集或同时属于T" role="presentation" style="position: relative;">TTT集,那么有一条边的方向就相当于钦定了。
我们考虑多项式,一条长度为kkk的链对应的多项式G(x)=1+2x+2x2+....xk−1+xk" role="presentation" style="position: relative;">G(x)=1+2x+2x2+....xk−1+xkG(x)=1+2x+2x2+....xk−1+xkG(x)=1+2x+2x^2+....x^{k-1}+x^k,特殊的,一个独立的点我们看成一条长度为111的链。
令F(x)" role="presentation" style="position: relative;">F(x)F(x)F(x)为所有链对应的G(x)G(x)G(x)的积,不难发现答案为Ans=1+∑n−1i=1(12)i(n−i)[xi]F(x)Ans=1+∑i=1n−1(12)i(n−i)[xi]F(x)Ans=1+\sum_{i=1}^{n-1}(\frac{1}{2})^{i(n-i)}[x^i]F(x)
求F(x)F(x)F(x)用分治NTTNTTNTT,可以证明时间复杂度为O(n log2 n)O(nlog2n)O(n\ log^2\ n)。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)using namespace std;
typedef long long ll;
const ll N=24e4,M=2e7,ZD=262144,mo=998244353;ll be[N],en[N],a[N],b[N];
ll f[M],jc[N],nn[N],w[N<<1];
int bits[ZD<<1],ss,mm;
int len[N],x,oo,n,m;inline int read()
{int o=0; char ch=' ';for(;ch<'0'||ch>'9';ch=getchar());for(;ch>='0'&&ch<='9';ch=getchar())o=o*10+(ch^48);return o;
}inline ll ksm(ll o,ll t)
{ll y=1;for(;t;t>>=1,o=o*o%mo)if(t&1)y=y*o%mo;return y;
}inline void prepare()
{w[0]=1; w[1]=ksm(3,(mo-1)/ZD);fo(i,2,ZD)w[i]=w[i-1]*w[1]%mo;
}inline ll mo1(ll o)
{return o>=mo?o-mo:o;}
inline ll mo2(ll o)
{return o<0?o+mo:o;}void dft(ll *a,int sig)
{fo(i,1,mm-2)if(i<bits[i])swap(a[i],a[bits[i]]);for(int m=2,half=1,D=ZD>>1;m<=mm;m<<=1,half<<=1,D>>=1)fo(i,0,half-1){register ll u=sig==1?w[i*D]:w[ZD-i*D],v;for(int j=i;j<mm;j+=m){v=a[j+half]*u%mo;a[j+half]=mo2(a[j]-v);a[j]=mo1(a[j]+v);}}if(sig==-1){ll ny=ksm(mm,mo-2);fo(i,0,mm-1)a[i]=a[i]*ny%mo;}
}void divi(int l,int r)
{if(l==r){be[l]=++oo;oo=en[l]=be[l]+len[l];fo(i,be[l],en[l])f[i]=2;f[be[l]]=f[en[l]]=1;return;}int mid=l+r>>1;divi(l,mid); divi(mid+1,r);int le=en[l]-be[l]+1+en[mid+1]-be[mid+1];ss=0; mm=1;while(mm<=le)mm<<=1,++ss; bits[0]=0;fo(i,1,mm-1)bits[i]=(bits[i>>1]>>1)|((i&1)<<ss-1);fo(i,0,mm-1)a[i]=b[i]=0;fo(i,be[l],en[l])a[i-be[l]]=f[i];fo(i,be[mid+1],en[mid+1])b[i-be[mid+1]]=f[i];dft(a,1); dft(b,1);fo(i,0,mm-1)a[i]=a[i]*b[i]%mo;dft(a,-1);be[l]=++oo; oo=en[l]=be[l]+le-1;fo(i,be[l],en[l])f[i]=a[i-be[l]];
}int main()
{cin>>n>>m;int zh=0;fo(i,1,m){len[i]=read(); zh=zh+len[i];fo(l,1,len[i])x=read();}fo(i,m+1,m+n-zh)len[i]=1;m+=n-zh; prepare();divi(1,m);ll ans=1;fo(i,1,n-1)ans=(ans+f[i+be[1]]*ksm((mo+1)/2,(ll)i*(n-i)))%mo;cout<<ans;
}

GDOI 2018 Day1 小学生图论题相关推荐

  1. [gdoi2018 day1]小学生图论题【分治NTT】

    正题 题目大意 一张随机的nnn个点的竞赛图,给出它的mmm条相互无交简单路径,求这张竞赛图的期望强联通分量个数. 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 ...

  2. JZOJ 5700. 【gdoi2018 day1】小学生图论题(graph)

    Description Input Output Sample Input Sample Input1 10 2 2 1 3 3 7 8 9 Sample Input2 3 0 Sample Outp ...

  3. 【gdoi2018 day1】小学生图论题

    题目大意: lj竞赛图. 题解: 考虑把强联通分量缩点,大概是这样的(画图水平有限): 看那些红色标记的边,强联通分量个数=红色边的个数+1 红色边的判定条件? 设它左边的点集为S,右边的为T. S到 ...

  4. 脑洞巨大:2018版小学生神填空

    百度首页 749978334 脑洞巨大:2018版小学生神填空 新浪新闻 04-30 14:01 原标题:2018版小学生神填空,家长沉默,老师流泪 这几天 有个朋友分享了 她女儿在小学做的填空题 看 ...

  5. COJ1978-LXX的图论题

    LXX的图论题 Description 由于lxx的图论和数据结构太弱了,大佬Z决定为lxx补一补.于是大佬Z为lxx出了一道题目,题目如下:给出一张有向图,图中有n个点,m条边,每条边上都有一个权值 ...

  6. 台式计算机排行榜2018,CPU天梯图性能排行榜 台式电脑CPU天梯图2018年4月最新版...

    通过最新的CPU天梯图我们可以了解各大CPU的性能,4月3日下午,Intel八代奔腾.赛扬等处理器全线上市,与之配套的H310.B360.H370经济型主板也一同上市,这意味着Intel八代Coffe ...

  7. 台式计算机排行榜2018,cpu天梯图2018最新版 2018电脑cpu处理器性能排行榜

    小编为大家分享2018年最新cpu天梯图,包含桌面端台式机cpu和移动端笔记本电脑cpu性能排行榜,电脑处理器cpu主要有Intel和AMD两大主流品牌.电脑cpu性能好坏决定一台电脑运算能力,所以用 ...

  8. MindManager 2018新视图洋葱图介绍

    MindManager 2018此次新出两个新视图,维恩图以及洋葱图,维恩图此前已经介绍过它的概念以及MindManager 2018中的使用方法了,现在来谈谈洋葱图吧. 洋葱图顾名思义,长得像洋葱. ...

  9. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

最新文章

  1. 严苛模式 strictmode
  2. 迷宫问题最短捷径c语言深搜,迷宫问题 C语言实现(深搜)
  3. Java - 强引用、弱引用、软引用、虚引用
  4. STM32基于AD5663的UV灯电压控制
  5. php三维数组转换二维数组,php 三维数组转二维数组(多维数组变合拼二维数组)(foreach循环 数组叠加)...
  6. Linux 下的几个游戏模拟器
  7. 项目管理修炼之道之估算工作
  8. Python OOP 项目实践:从农药到吃鸡
  9. python的前端和后端_前端与后端的数据交互(jquery ajax+python flask)
  10. 迭代器模式C++实现
  11. 国庆在家太无聊, 用Java爬了上千张小姐姐照片...
  12. 《大前端进阶 安全》系列 HTTPS详解(通俗易懂)
  13. adb的环境搭建,下载和卸载app
  14. 【Java编程】模拟帐户存取和转账操作
  15. python math.sqrt怎么扩大倍数_Python math.sqrt方法代码示例
  16. Python实现高级电影特效,CXK也能影分身
  17. 第十届“中国电机工程学会杯”全国大学生电工数学建模竞赛 B 题 全面二孩政策对我国人口结构的影响
  18. Web全栈~19.Java语言基本结构
  19. 栈的压入、弹出序列和栈所有可能的弹出顺序
  20. 原神3.4私服一键包搭建教程windows+linux

热门文章

  1. DRA成国家标准 音视频步入中国时代
  2. 性能测试-perfdog
  3. 计算机作文+300字,有关电脑作文300字六篇
  4. 图解通信原理与案例分析-35:以太网MAC层的通信原理--MAC帧格式与调度策略:载波侦听与冲突检测CSMA/CD、载波侦听与冲突避免(信道空闲保证)CSMA/CA、流控
  5. 如何利用积分系统提升社群活跃度与留存率?
  6. 小程序创业,有哪些行业方向可以选?
  7. 【office各个版本安装包】
  8. ae渲染存在偏移_AE节点式粒子插件stardust安装使用方法
  9. 配音小程序源码,内置106个配音角色
  10. keil5打开kil4工程不兼容 device无法选择芯片