题目大意

  求\(n\)个点\(n\)条边的无向连通图的个数

  \(n\leq 5000\)

题解

  显然是一个环上有很多外向树。

  首先有一个东西:\(n\)个点选\(k\)个点作为树的根的生成森林个数为:

\[\binom{n}{k}\times n^{n-k-1}\times 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\))。

  最终的式子是

\[\begin{align}
&~~~~~\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序列的更多相关文章

  1. CF :K 一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离。

    题意:给你一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离. 思路:LCA+思维. 设a,b两点间的距离为f(a,b) 则f(a,b)=dis[a]+dis[b]-2*dis[lca( ...

  2. Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边

    无向连通图最少包含多少条边 题目 问题描述 一个包含有2019个结点的无向连通图,最少包含多少条边? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填 ...

  3. 用HTML、CSS、JS制作圆形进度条(无动画效果)

    逻辑 1.首先有一个圆:蓝色的纯净的圆,效果: 2.再来两个半圆,左边一个,右边一个将此蓝色的圆盖住,效果: 此时将右半圆旋转60°,就会漏出底圆,效果:   然后我们再用一个比底圆小的圆去覆盖这个大 ...

  4. DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能

    以前作的上传,在糙了,所以在用户体验上改进一下. 同时,结合DJANGO作定位上传. 这其中分两步进行,第一次上传到TMP目录下, 第二次,将TMP下的文件转移到标准目录下. form.py file ...

  5. SQL Server2008 删除重复记录只剩一条(无Uid)

    INSERT INTO 表1   SELECT  *  FROM  视图1 CREATE TABLE  ##TMP01                                    ---创建 ...

  6. NOIP2017 国庆郑州集训知识梳理汇总

    第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤.  成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...

  7. 【bzoj3456】 城市规划

    题目 一句话题意,无向连通图计数 技不如人,甘拜下风 设\(f_i\)表示\(i\)个节点构成的无向连通图数量 之后...之后就不会了 于是抄题解 考虑容斥 \[f_i=t_i-\sum_{j=1}^ ...

  8. 【STSRM10】数学上来先打表

    [算法]DP+数学计数 [题意]给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边. 2.不存在 ...

  9. ZROI 暑期高端峰会 A班 Day2 线性代数

    高斯消元 很普及组,不讲了 当主元没有逆的时候可以辗转相除. 如果也没有带余数除法--没救了 逆矩阵 我们定义矩阵 \(A\) 的逆矩阵为 \(A^{-1}\),满足 \(AA^{-1}=A^{-1} ...

随机推荐

  1. Python-正则表达式总结版

    前言: 总是写不好正则表达式,时间长不用就有些忘记了,故此在总结一篇文章以便日后查阅. 一.常用的匹配规则总结表 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字及下划线 \s 匹配任意空 ...

  2. H5 31-CSS元素显示模式转换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. webapack

    webpack  就是一个前端资源加载.打包工具. 核心思想:会根据(js css less文件)模块依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源,减少页面请求. wapack ...

  4. 关于对于system函数和c++标准下的新的变量定义方式{}

  5. Xcode中控制台中打印中文处理

    xcode 10以后的方法,一般使用 #ifdef DEBUG #define NSLog(FORMAT, ...) fprintf(stderr,"\n %s:%d %s\n", ...

  6. ElasticSearch Nosql

    把 ElasticSearch 当成是 NoSQL 数据库 Elasticsearch 可以被当成一个 "NoSQL"-数据库来使用么? NoSQL 意味着在不同的环境下存在不同的 ...

  7. 福州大学软件工程1816 | W班 第6次作业WordCount成绩排名

    作业链接 WordCount进阶需求 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客评分细则(满分60,最终折算为40分) 在文章开头给出结对同学的博客链接.本作 ...

  8. SQLSERVER sa 用户密码修改的方法

    本次驱动人生病毒的收获 . 偷懒总会有报应. . 应用(数据库或者是web应用nginx等.)都不要使用最高级别权限用户来使用 虽然这样的环境问题最少. . 密码还是需要定期更换的,虽然有成本,但是也 ...

  9. Day 5-<补充> 类的的继承和查找顺序

    类的继承于查找顺序: 在py2中,不继承object的类为经典类,经典类继承查找:深度优先. 在py3中,默认继承object,所以python3中都是新式类,新式类的继承查找:广度优先. 类的特殊属 ...

  10. leetcode:Roman to Integer and Integer to Roman

    2015-06-03 罗马数字以前接触过I到VIII比较多,直到遇见这个题目才知道更详细.阿拉伯数字和罗马数字之间的转换最重的是了解罗马数字的规则. 罗马数字规则:(总结) 1, 罗马数字共有7个,即 ...