洛谷 P2144 [FJOI2007]轮状病毒
P2144 [FJOI2007]轮状病毒
题目描述
轮状病毒有很多变种。许多轮状病毒都是由一个轮状基产生。一个\(n\)轮状基由圆环上\(n\)个不同的基原子和圆心的一个核原子构成。\(2\)个原子之间的边表示这\(2\)个原子之间的信息通道,如图\(1\)。
\(n\)轮状病毒的产生规律是在\(n\)轮状基中删除若干边,使各原子之间有唯一一条信息通道。例如,共有\(16\)个不同的\(3\)轮状病毒,如图\(2\)所示。
给定\(n(n\le100)\),编程计算有多少个不同的\(n\)轮状病毒。

输入输出格式
输入格式:
第一行有\(1\)个正整数\(n\)。
输出格式:
将编程计算出的不同的\(n\)轮状病毒数输出
发现题目要求求出看起来很有规律的无向图生成树个数,显然可以找一些规律/打表/递推之类的,但不妨采用比较暴力的方法,矩阵树定理。
然后发现事情并没有那么简单,如果用矩阵树定理暴力去做的话,你可以选择一些乱搞/手写高精度小数类之类的方法
而之前又说,这个图比较特殊,所以,我们可以研究一下基尔霍夫矩阵的行列式有没有什么比较特殊的求法,\(n+1(n>2)\)阶的基尔霍夫矩阵大概长这个样子
\]
\(n\)阶主子式肯定是扔第一行第一列啊,因为我们想找行列式的递推规律,然后变成这样
\]
设这个矩阵为\(A_n\),那么\(n\)的答案就是\(\det A_n\),然后我们考虑求出这个矩阵的行列式
由“行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和”
- 余子式:在\(n\)阶行列式中,把元素\(a_{i,j}\)所在第\(i\)行和第\(j\)行划去后,留下的\(n-1\)阶行列式叫元素\(a_{i,j}\)的余子式,记做\(M_{i,j}\),定义代数余子式为\(A_{i,j}=(-1)^{i+j}M_{i,j}\)
我们可以扔第一行,因为\((1,n)\)和\((n,1)\)两个位置的东西看起来巨难受。
拆开第一行第一列得到
\]
这个看起来就可以递推的东西,设\(n-1\)阶的它为\(B_{n-1}\)。为了方便,以下\(A_n,B_n\)也指代行列式的值。
然后剩下有贡献的第一行第二列和第一行第\(n-1\)列,因为余子式的正负与\(n\)有关,不妨先设\(n\)为奇数,偶数的情况是一样的。
\]
这是拆了第一行第二列,没思路再拆,发现扔第一行第一列后是\(-B_{n-2}\),扔第\(n-1\)行第\(1\)列是主对角线全为\(-1\)的下三角,行列式的值为\(-1\),再乘上\((-1)^{n-1+1}(-1)\)还是\(-1\)
然后是第一行第\(n\)列
\]
注意这里是负的,因为\(n\)是奇数。然后还是拆第一列,发现答案还是\(-B_{n-2}\)和\(-1\)
于是我们有\(A_n=3B_{n-1}-2B_{n-2}-2\)
以同样的方法对\(B\)做讨论,可以得到\(B_n=3B_{n-1}-B_{n-2}\)
然后联立一下得到\(A_{n}=3A_{n-1}-A_{n-2}+2\),带入到\(n\le2\)发现式子仍然成立,然后直接递推+高精即可。
Code:
#include <cstdio>
#include <cstring>
const int N=110;
struct bignum
{
int num[N];
bignum(){memset(num,0,sizeof(num));}
bignum friend operator +(bignum n1,bignum n2)
{
int len=n1.num[0]>n2.num[0]?n1.num[0]:n2.num[0];
for(int i=1;i<=len;i++)
{
n1.num[i]+=n2.num[i];
n1.num[i+1]+=n1.num[i]/10;
n1.num[i]%=10;
}
if(n1.num[len+1]) n1.num[0]=len+1;
else n1.num[0]=len;
return n1;
}
bignum friend operator -(bignum n1,bignum n2)
{
int len=n1.num[0];
for(int i=1;i<=len;i++)
{
n1.num[i]-=n2.num[i];
if(n1.num[i]<0)
n1.num[i]+=10,n1.num[i+1]--;
}
if(n1.num[len]) n1.num[0]=len;
else n1.num[0]=len-1;
return n1;
}
}ans[N],two;
int main()
{
int n;scanf("%d",&n);
ans[1].num[0]=1,ans[1].num[1]=1,ans[2].num[0]=1,ans[2].num[1]=5,two.num[0]=1,two.num[1]=2;
for(int i=3;i<=n;i++) ans[i]=ans[i-1]+ans[i-1]+ans[i-1]-ans[i-2]+two;
for(int i=ans[n].num[0];i;i--) printf("%d",ans[n].num[i]);
return 0;
}
2018.12.20
洛谷 P2144 [FJOI2007]轮状病毒的更多相关文章
- 洛谷P2144 [FJOI2007]轮状病毒
可以用Matrix-Tree定理,然而被卡精度 #include<cstdio> #include<cstdlib> #include<algorithm> #in ...
- 洛谷 P2144 BZOJ 1003 [FJOI2007]轮状病毒
题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间的信息通道,如图1. n轮状病毒的产生规律 ...
- P2144 [FJOI2007]轮状病毒
题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间的信息通道,如图1. n轮状病毒的产生规律 ...
- luogu P2144 [FJOI2007]轮状病毒
传送门 随便摸一发题解算了 打表找规律 前五个答案是 1 5 16 45 121 其实是 1^2 3^2-4 4^2 7^2-4 11^2 底数就是类似于斐波那契数列,还有偶数项要减4 #includ ...
- 【洛谷】2144:[FJOI2007]轮状病毒【高精度】【数学推导??(找规律)】
P2144 [FJOI2007]轮状病毒 题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- Http protocal
https://tools.ietf.org/html/rfc2616 1. 状态码:status code 1xxx:信息--请求被接收,继续下一步处理 2xxx:成功--请求行为被 ...
- ThinkPHP3.2开发仿京东商城项目实战视频教程
ThinkPHP3.2仿京东商城视频教程实战课程,ThinkPHP3.2开发大型商城项目实战视频 第一天 1.项目说明 2.时间插件.XSS过滤.在线编辑器使用 3.商品的删除 4.商品的修改完成-一 ...
- CHAPTER 38 Reading ‘the Book of Life’ The Human Genome Project 第38章 阅读生命之书 人体基因组计划
CHAPTER 38 Reading ‘the Book of Life’ The Human Genome Project 第38章 阅读生命之书 人体基因组计划 Humans have about ...
- Netty源码分析第2章(NioEventLoop)---->第4节: NioEventLoop线程的启动
Netty源码分析第二章: NioEventLoop 第四节: NioEventLoop线程的启动 之前的小节我们学习了NioEventLoop的创建以及线程分配器的初始化, 那么NioEvent ...
- 炸!分享美团面试关于selenium的面试题
个人分类: 软件测试 编辑 在这个互联网技术快速迭代的时代,每个测试员都知道技术对于职业发展的重要性,那些技术好的测试员不仅薪资高,而且大多数集中在一线互联网企业工作,让人感觉非常高大上的同时,也想去 ...
- import 导入包的特别用法总结
指定别名 可以为包指定一个别名,以便记忆或提高输入效率 如 import str "strings" 在使用的时候可以直接使用别名,如原先要写成strings.Contains,现 ...
- kali linux执行apt-get update失败(数字签名过期)
想要安装某个软件,执行apt-get update 失败,出现下面的错误: 自己查看了更新源是没有问题的,根据提示的错误google了一下,发现是数字签名过期了. 执行下面命令: apt-key ad ...
- export命令详解
基础命令学习目录首页 export 的基本作用就是将父shell中的局部变量设置为环境变量,使得该变量可以在子shell中使用.下面设置两种情景对export进行原理解析. 情景 1. 有一个名为m ...
- python正则表达式,以及应用[下载图片]
regular expresion由一系列特定字符及其组合成的字符串,用来对目标字符串进行过滤操作.. re相关知识点 python正则表达式库为re,用import re导入,在然后用re.comp ...
- [linux] LVM磁盘管理(针对xfs和ext4不同文件系统)
简单来说就是:PV:是物理的磁盘分区VG:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库或者是几个大的硬盘LV:也就是从VG中划分的逻辑分区如下图所示PV.VG.LV三者 ...