【XSY1295】calc n个点n条边无向连通图计数 prufer序列
题目大意
求\(n\)个点\(n\)条边的无向连通图的个数
\(n\leq 5000\)
题解
显然是一个环上有很多外向树。
首先有一个东西:\(n\)个点选\(k\)个点作为树的根的生成森林个数为:
\]
前面\(\binom{n}{k}\)是这些根的选编号的方案数,后面是prufer序列得到的:前面\(n-k-1\)个数可以是\(1\)$n$,第$n-k$个数是$1$\(k\)。
我的理解是:每个序列决定了一部分点作为"叶子节点",剩下的每个点按顺序选一个编号最小的"叶子节点"作为这个点的儿子(选编号最小的是因为1.如果一个点可以选多个儿子就不会重复计数;2.两个数的先后顺序不同,那么选的儿子也不同,会让先后顺序成为影响因素),然后如果这个点不能再选儿子,那么这个点就会成为"叶子节点"。选了\(n-k-1\)个点后会剩下\(k\)个根和一个不是根的点,然后\(k\)个根中的一个点连向剩下这个点。
最后\(k\)个点的环的排列方式有\(\frac{(k-1)!}{2}\)。你可以选编号最小的点为"根",剩下\(k-1\)个点每次选一个点连向上一个点,最后一个点再连向第一个点。因为环可以翻转,所以方案数要除以\(2\)。你也可以认为是先生成一个排列,然后旋转这个环(除以\(k\)),然后翻转这个环(除以\(2\))。
最终的式子是
&~~~~~\sum_{k=3}^{n}\binom{n}{k}\times n^{n-k-1}\times k\times \frac{(k-1)!}{2}\\
&=\sum_{k=3}^{n}\frac{n!\times n^{n-k-1}\times k\times (k-1)!}{k!\times (n-k)!\times 2}\\
&=\sum_{k=3}^{n}\frac{n!n^{n-k-1}}{2(n-k)!}
\end{align}
\]
写个高精度什么的乱搞一下就可以了。
时间复杂度:\(O(n^2)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int p=10000;
struct bign
{
int a[5010];
bign()
{
memset(a,0,sizeof a);
}
int &operator [](int x)
{
return a[x];
}
bign &operator *=(int v)
{
int i,s,g=0;
bign &a=*this;
for(i=1;i<=5000;i++)
{
s=g+a[i]*v;
g=s/p;
a[i]=s%p;
}
return a;
}
bign &operator /=(int v)
{
int i,s,g=0;
bign &a=*this;
for(i=5000;i>=1;i--)
{
s=g*p+a[i];
a[i]=s/v;
g=s%v;
}
g=0;
for(i=1;i<=5000;i++)
{
s=g+a[i];
a[i]=s%p;
g=s/p;
}
return a;
}
bign &operator +=(bign &b)
{
int i,s,g=0;
bign &a=*this;
for(i=1;i<=5000;i++)
{
s=a[i]+b[i]+g;
a[i]=s%p;
g=s/p;
}
return a;
}
};
bign a,ans;
int main()
{
int n;
scanf("%d",&n);
int i;
a[1]=1;
for(i=2;i<=n-1;i++)
a*=i;
ans+=a;
for(i=n-1;i>=3;i--)
{
a*=n;
a/=n-i;
ans+=a;
}
ans/=2;
for(i=5000;!ans[i];i--);
printf("%d",ans[i]);
for(i--;i;i--)
printf("%04d",ans[i]);
printf("\n");
return 0;
}
【XSY1295】calc n个点n条边无向连通图计数 prufer序列的更多相关文章
- CF :K 一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离。
题意:给你一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离. 思路:LCA+思维. 设a,b两点间的距离为f(a,b) 则f(a,b)=dis[a]+dis[b]-2*dis[lca( ...
- Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
无向连通图最少包含多少条边 题目 问题描述 一个包含有2019个结点的无向连通图,最少包含多少条边? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填 ...
- 用HTML、CSS、JS制作圆形进度条(无动画效果)
逻辑 1.首先有一个圆:蓝色的纯净的圆,效果: 2.再来两个半圆,左边一个,右边一个将此蓝色的圆盖住,效果: 此时将右半圆旋转60°,就会漏出底圆,效果: 然后我们再用一个比底圆小的圆去覆盖这个大 ...
- DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能
以前作的上传,在糙了,所以在用户体验上改进一下. 同时,结合DJANGO作定位上传. 这其中分两步进行,第一次上传到TMP目录下, 第二次,将TMP下的文件转移到标准目录下. form.py file ...
- SQL Server2008 删除重复记录只剩一条(无Uid)
INSERT INTO 表1 SELECT * FROM 视图1 CREATE TABLE ##TMP01 ---创建 ...
- NOIP2017 国庆郑州集训知识梳理汇总
第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤. 成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...
- 【bzoj3456】 城市规划
题目 一句话题意,无向连通图计数 技不如人,甘拜下风 设\(f_i\)表示\(i\)个节点构成的无向连通图数量 之后...之后就不会了 于是抄题解 考虑容斥 \[f_i=t_i-\sum_{j=1}^ ...
- 【STSRM10】数学上来先打表
[算法]DP+数学计数 [题意]给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边. 2.不存在 ...
- ZROI 暑期高端峰会 A班 Day2 线性代数
高斯消元 很普及组,不讲了 当主元没有逆的时候可以辗转相除. 如果也没有带余数除法--没救了 逆矩阵 我们定义矩阵 \(A\) 的逆矩阵为 \(A^{-1}\),满足 \(AA^{-1}=A^{-1} ...
随机推荐
- getQueryStringByName url参数/
MasterId: (masterIdUrl != null && masterIdUrl != "") ? masterIdUrl : null ClassId: ...
- Linux模拟控制网络时延
之前以为可以使用Linux自带的工具模拟控制网络时延,所以上网找了一些资料.后来发现,找到的资料目前只支持在一个网卡上模拟发送报文的时延,而不能设置有差别的网络时延,或者说当要模拟的向A发送的时延与要 ...
- E: 无法打开锁文件 /var/lib/dpkg/lock-frontend - open (13: 权限不够)E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),请查看您是否正以 root 用户运行?
一.解决方案 修改root密码,以root身份安装 sudo pwdroot root # 输入新密码即可
- 弹性(flex)布局
五大主流浏览器及其内核:谷歌浏览器:Google Chrome.内核是blink火狐浏览器:Mozilla Firefox.内核是Gecko:欧鹏浏览器:OPera.内核是blink苹果浏览器:Saf ...
- Git分支合并:Merge、Rebase的选择
git代码合并:Merge.Rebase的选择 - iTech - 博客园http://www.cnblogs.com/itech/p/5188932.html Git如何将一个分支的修改同步到另一个 ...
- 一、npm基础
一.什么是npm? npm 是模块管理工具,可以下载.更新第三方模块,也可以发布自己的模块共替他人使用,主要目的在于分享和重用代码: 二.下载安装node,更新npm node 下载网址 https ...
- Java中有关Null的9件事(转)
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- redis4.X
tar -zxvf ****cd /redismakecd /srcmake install vi redis.confdaemonize yes mkdir /usr/local/redis/bin ...
- js怎么能取得多选下拉框选中的多个值?
方法:获取多选下拉框对象数组→循环判断option选项的selected属性(true为选中,false为未选中)→使用value属性取出选中项的值.实例演示如下: 1.HTML结构 1 2 3 4 ...
- MT4用EA测试历史数据时日志出现:stopped because of stop out
今天用嘉盛的MT4测试一个EA,谁知道才走了十几天数据就完 了,看结果本金也没亏完啊,才亏了一半,而且我测的是1年的时间. 查看日志一有条警告:stopped because of stop out, ...