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

正题


题目大意

一张随机的nnn个点的竞赛图,给出它的mmm条相互无交简单路径,求这张竞赛图的期望强联通分量个数。

1≤n,m≤1051\leq n,m\leq 10^51n,m105


解题思路

先考虑m=0m=0m=0的做法,此时我们考虑一个强联通块的贡献,注意到竞赛图中强联通块的会构成一条链的形式,枚举一个大小SSS,那么此时联通块内到联通块外的边方向确定,那么这个联通块产生贡献的的概率就是12S(n−S)\frac{1}{2}^{S(n-S)}21S(nS),选出这个联通块的方案就是(ni)\binom{n}{i}(in)
那么答案就是
∑i=1n12S(n−S)(ni)\sum_{i=1}^n\frac 1 2^{S(n-S)}\binom{n}{i}i=1n21S(nS)(in)

考虑包含给出路径的情况,因为无交,所以点的编号不影响答案,只有路径长度影响方案。

考虑一条路径对一个强联通分量造成的贡献,考虑如果一条链的一半在这个块内,一条在这个块外,那么就会确定一条边的方案。所以除数要除以222

把单点看成链的话,那么一个块由多条链组成,对于每条链构建一个形如
1+2x+2x2+...+2xl−1+xl−11+2x+2x^2+...+2x^{l-1}+x^{l-1}1+2x+2x2+...+2xl1+xl1
的多项式,然后跑分治NTTNTTNTT乘起来再用上面的式子做就好了。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define ll long long
using namespace std;
const ll N=4e5+10,T=20,P=998244353;
struct Poly{ll a[N],n;
}F[T];
ll n,m,a[N],r[N],x[N],y[N];
bool v[T];
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void NTT(ll *f,ll n,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll tmp=power(3,(P-1)/p),len=p>>1;if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[i+len]%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return;
}
void Mul(Poly &F,Poly &G){ll n=1;while(n<F.n+G.n)n<<=1;for(ll i=0;i<F.n;i++)x[i]=F.a[i];for(ll i=0;i<G.n;i++)y[i]=G.a[i];for(ll i=F.n;i<n;i++)x[i]=0;for(ll i=G.n;i<n;i++)y[i]=0;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);NTT(x,n,1);NTT(y,n,1);for(ll i=0;i<n;i++)x[i]=x[i]*y[i]%P;NTT(x,n,-1);for(ll i=0;i<n;i++)F.a[i]=x[i];F.n=F.n+G.n-1;return; 
}
ll Find(){for(ll i=0;i<T;i++)if(!v[i]){v[i]=1;return i;}
}
ll Solve(ll l,ll r){if(l==r){ll p=Find();F[p].a[0]=1;F[p].a[a[l]]=1;for(ll i=1;i<a[l];i++)F[p].a[i]=2;F[p].n=a[l]+1;return p;}ll mid=(l+r)>>1;ll ls=Solve(l,mid),rs=Solve(mid+1,r);Mul(F[ls],F[rs]);v[rs]=0;return ls;
}
signed main()
{freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);n=read();m=read();ll sum=n,ans=0;for(ll i=1;i<=m;i++){a[i]=read();sum-=a[i];for(ll j=1,x;j<=a[i];j++)x=read();}while(sum)a[++m]=1,sum--;ll p=Solve(1,m);for(ll i=0;i<n;i++)(ans+=F[p].a[i]*power((P+1)/2,i*(n-i))%P)%=P;printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

背包问题 DP

各种各样的基础背包 0-1 背包 非常朴素&#xff0c;复杂度 \(O(nV)\) void z_o_pack(int c,int v) {for(int iV;i>c;i--)dp[i]max(dp[i],dp[i-c]v); } 完全背包 复杂度 \(O(nV)\) void comp_pack(int c,int v) {for(int ic;i<V;i)dp[i]max(dp[i],dp[i-c]v); } 多重背包 单…

P5081 Tweetuzki爱取球(期望)(线性求逆元)

文章目录题目描述解析代码题目描述 解析 首先有一个很重要的引理&#xff1a; 若一件事做成的概率是p&#xff0c;则其做成需要次数的期望是1/p 为什么呢&#xff1f; 我们设做成这件事的期望次数是x 就可以列出方程&#xff1a; x1p∗0(1−p)∗xx1p*0(1-p)*xx1p∗0(1−p)∗x …

Matlab与线性代数

文章目录多项式求解1.2 多项式四则运算1.3 多项式的分解与合并行列式求解3、矩阵基本运算➢ 3.2 矩阵的取块和变换➢ 3.3 矩阵的基本运算4、求解线性方程组多项式求解 ➢ 1.1 多项式表达式与根 有关多项式函数表达式与根的Matlab命令&#xff1a; poly2sym 返回由多项式系数转…

【 CF1186D,E,F】Vus the Cossack and Numbers/Vus the Cossack and a Field/Vus the Cossack and a Graph

太ex了&#xff0c;哭了哭了orz 后面两道平均一道花了我一天啊&#xff01; 文章目录D&#xff1a;Vus the Cossack and Numbers题意翻译题解代码实现E&#xff1a;Vus the Cossack and a Field题意翻译题解代码实现F:Vus the Cossack and a Graph题目暴力题解代码实现官方题解…

IdentityServer4与ocelot实现认证与客户端统一入口

关于IdentityServer4与ocelot博客园里已经有很多介绍我这里就不再重复了。ocelot与IdentityServer4组合认证博客园里也有很多&#xff0c;但大多使用ocelot内置的认证&#xff0c;而且大多都是用来认证API的&#xff0c;查找了很多资料也没看到如何认证oidc&#xff0c;所以这里…

CF1556D-Take a Guess【交互】

正题 题目链接:https://codeforces.com/contest/1556/problem/D 题目大意 现在有nnn个你不知道的数字&#xff0c;你有两种询问操作 询问两个下标的数字的andandand询问两个下标的数字的ororor 要求在2n2n2n次操作以内求出第kkk小的数字 1≤n≤104,0≤ai≤1091\leq n\leq 1…

YBTOJ:彩球抽取(期望)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;可以使用dp解决本题 设fi,j,k&#xff1a;操作i轮之后编号j的小球有k个的概率 转移和统计答案就都不难了 但是还有一个问题 不难发现这个题循环下去是可以无穷无尽的 所以限定一个i的上界&#xff08;如500000&#xf…

魔改森林

题意&#xff1a; 曾经有一道叫做迷雾森林的题目&#xff0c;然而牛牛认为地图中的障碍太多&#xff0c;实在是太难了&#xff0c;所以删去了很多点&#xff0c;出了这道题。 牛牛给出了一个n行m列的网格图 初始牛牛处在最左下角的格点上(n1,1)&#xff0c;终点在右上角的格点…

基于IdentityServer4 实现.NET Core的认证授权

IdentityServer4是什么&#xff1f;IdentityServer4是基于ASP.NET Core实现的认证和授权框架&#xff0c;是对OpenID Connect和OAuth 2.0协议的实现。OpenID Connect 和 OAuth2.0是什么OpenID Connect:OpenID Connect由OpenID基金会于2014年发布的一个开放标准, 是建立在OAuth …

常见存储、查找算法

存储 散列存储&#xff1a;即哈希的存储方式。 顺序存储&#xff1a;数组的存储方式 链式存储&#xff1a;链式前向星、vector<> 压缩存储 索引存储 查找 常见查找算法 顺序查找 一个一个往下找&#xff0c;复杂度 \(O(\dfrac{n1}{2})\) 。 适合顺序存储&#xff0c…

CF1556E-Equilibrium【栈,树状数组】

正题 题目连接:https://codeforces.com/contest/1556/problem/E 题目大意 两个长度为nnn的序列a,ba,ba,b&#xff0c;qqq次询问一个区间[l,r][l,r][l,r]。 在这个区间中你每次可以选择一个长度为偶数的下标递增的序列&#xff0c;让奇数位置的aaa加一&#xff0c;偶数位置的…

[COCI 2018#5]Parametriziran

这道题呢&#xff01; 算了&#xff0c;不要让这玩意儿活着祸害众生吧&#xff01;让我们来拯救苍生于苦海之中&#xff01;&#xff01; 骚话连篇ing 题目 由小写英文字母和问号组成的字符串成为参数化单词&#xff08;例如&#xff1a;??cd,bcd,??&#xff09;。如果两…

P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

传送门 文章目录解析解析 很显然&#xff0c;让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题&#xff0c;其实第一感觉是bfs 但是状态数理论上最差可以达到815&#xff0c;&#xff08;当然基本不可能跑满&#xff09;&#xff…

AcWing 1402. 星空之夜 1月28

AcWing 1402. 星空之夜 1月28 题意&#xff1a; 一个星群是指一组非空的在水平&#xff0c;垂直或对角线方向相邻的星星的集合。 一个星群不能是一个更大星群的一部分。 星群可能是相似的。 如果两个星群的形状、包含星星的数目相同&#xff0c;那么无论它们的朝向如何&#…

RMQ、ST表

ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构。 可重复贡献问题&#xff1a;区间按位和、区间按位或、区间 \(\gcd\) 、区间最大、区间最小等满足结合律且可重复统计的问题。 模板预处理&#xff1a;(以区间最大值为例) void pre_work() {for(int i2;i<n;i) lg…

NumSharp v0.6 科学计算库发布,新增 LAPACK 的线性库支持

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[COCI] Zamjena

连这种模拟题都能。。。orz ex&#xff0c;太恶心了&#xff01; 驰骋坑底这么久了&#xff0c;我明白了 开始吧&#xff01;我发誓&#xff0c;这个超级兵&#xff0c;我就算用小书包平A都要A了它 题目 Vlatko喜欢使用整数数组&#xff0c;他在一张纸上写下了两个数组&…

P7470-[NOI Online 2021 提高组]岛屿探险【Trie,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P7470 题目大意 给出nnn个二元组(a,b)(a,b)(a,b)。 qqq次询问给出(l,r,c,d)(l,r,c,d)(l,r,c,d)表示询问[l,r][l,r][l,r]中有多少二元组满足cxora≤min(b,d)c\ xor\ a\leq min(b,d)c xor a≤min(b,d)。 1≤n,q≤1051\leq n,q\…

P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)

洛谷传送门 文章目录题目描述解析代码题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点&#xff0c;二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直接枚举左上方的点二分呢&#xff1f;awa 很遗憾的是… 那样答案就没有…

初赛—错题集

计算机基础知识 LAN&#xff1a;局域网&#xff0c;WAN&#xff1a;广域网&#xff0c;MAN&#xff1a;城域网 汇编语言是(依赖于具体计算机)的低级程序设计语言 计算机操作的最小时间单位是(时钟周期)。 注意所需空间需要 \(\div 8\) &#xff01;&#xff01;&#xff01;…