1002: [FJOI2007]轮状病毒

Description

给定n(N<=100),编程计算有多少个不同的n轮状病毒。

Input

第一行有1个正整数n。

Output

将编程计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16
 
分析:开始想用排列搞搞。。发现里面判断边的端点是否重合才能得到几个外围的边的顶点个数。。发现很无力;
一部分题解说要使用生成树计数-Matrix-tree定理;
得到Kirchhoff矩阵C(就是用原图的 度数矩阵D - 邻接矩阵A)之后,答案就是这个Kirchhoff矩阵C的任意一个n-1阶主子式(即去除第r行第r列剩余的矩阵)的行列式的值;
难点就是解这个n-1阶主子式。。(解是一个递推式,即F[n]与F[n-1]...的关系式)
一种方法是利用基本行变化和列变化来找到规律,有点慢。详见:vfleaking的题解
还有一种方法是按照某一行展开,但是这种简便方法,我并没有找到和第一种一样的式子。。
最后得到的递推式为: F[n] = 3*F[n-1] - F[n-2] + 2;F[1] = 1,F[2] = 5;
使用高精度预处理即可;
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
//typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
const int maxl = ;
const int ten[]={,,,,};
struct Biginter{
int d[maxl]; // 最大数位只取四位,因为相乘不会爆int~~,并且每次构造对象时d[]一定要为0;
Biginter(char *s){
int len = strlen(s);
d[] = (len-)/+;//每一个数组里面存四位,并且d[0]记录的是最多总的位数(下标)
int i,j,k;
for(i = ;i <= d[];i++) d[i] = ;
for(i = len-;i >= ;i--){
j = (len--i)/+; //保存的下标;
k = (len--i)%;//在每一个下标保存中仍然要保存顺序;
d[j] += ten[k]*(s[i]-'');
}
while(d[] > && d[d[]] == ) d[]--; //可能就为0;
}
Biginter(){MS0(d);}//手动初始化为0
void tostring(){ //输出后换行
out(d[d[]]);
for(int i = d[]-;i > ;i--){
printf("%04d",d[i]);
}
puts("");
}
};
bool operator <(const Biginter& a,const Biginter& b)
{
if(a.d[] != b.d[]) return a.d[] < b.d[];
for(int i = a.d[];i >= ;i--){
if(a.d[i] != b.d[i]) return a.d[i] < b.d[i];
}
return false;// a== b
}
bool operator ==(const Biginter& a,const Biginter& b)
{
if(a.d[] != b.d[]) return false;
for(int i = a.d[];i >= ;i--){
if(a.d[i] != b.d[i]) return false;
}
return true;
}
Biginter operator +(const Biginter& a,const Biginter& b)
{
Biginter c;
c.d[] = max(a.d[],b.d[]);
for(int i = ;i <= c.d[];i++){
c.d[i] += a.d[i]+b.d[i];
if(c.d[i] >= ten[]){//其实每次只需要看是否要进1即可;
c.d[i] -= ten[],c.d[i+]++;
if(i == c.d[]){
++c.d[];
break;
}
}
}
return c;
}
Biginter operator -(const Biginter& a,const Biginter& b){
Biginter c;
c.d[] = a.d[];
for(int i = ;i <= c.d[];i++){
c.d[i] += a.d[i] - b.d[i];
if(c.d[i] < ){
c.d[i] += ten[];
c.d[i+]--;
}
}
while(c.d[] > && c.d[c.d[]] == ) c.d[]--;
return c;
}
Biginter operator *(const Biginter& a,const Biginter& b)
{
Biginter c;
c.d[] = a.d[]+b.d[];
for(int i = ;i <= a.d[];i++){
int x = ;
for(int j = ;j <= b.d[];j++){
x += a.d[i]*b.d[j]+c.d[i+j-];
c.d[i+j-] = x%ten[];//相乘时需要记录超出多少需要mod,但相加减时超出数值就是1~~不用mod更快
x /= ten[];
}
c.d[i+b.d[]] = x;//***
}
while(c.d[] > && c.d[c.d[]] == ) c.d[]--;
return c;
}
int main()
{
Biginter F[]={"","",""},F3(""),F2("");
rep1(i,,)
F[i] = F[i-]*F3 - F[i-] + F2;
int n;
while(scanf("%d",&n) == ){
F[n].tostring();
}
return ;
}
 

【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度的更多相关文章

  1. BZOJ 1002 FJOI2007 轮状病毒 递推+高精度

    题目大意:轮状病毒基定义如图.求有多少n轮状病毒 这个递推实在是不会--所以我选择了打表找规律 首先执行下面程序 #include<cstdio> #include<cstring& ...

  2. 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

    Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...

  3. bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Statu ...

  4. BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5577  Solved: 3031[Submit][Statu ...

  5. BZOJ 1002 [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3106  Solved: 1724[Submit][Statu ...

  6. 生成树的计数(基尔霍夫矩阵):BZOJ 1002 [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3928  Solved: 2154[Submit][Statu ...

  7. 【刷题】BZOJ 1002 [FJOI2007]轮状病毒

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...

  8. bzoj 1002 [FJOI2007]轮状病毒——打表找规律

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 看 Zinn 的博客:https://www.cnblogs.com/Zinn/p/9 ...

  9. 1002: [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2609  Solved: 1450[Submit][Statu ...

随机推荐

  1. ADO.Net的小知识(连接数据库)

    数据库连接分为两种,分别是断开式连接和打开式连接.下面分别和大家分享一下断开时连接的查询: (1)引入命名空间:using System.Data.SqlClient; 该语句用于导入和ADO.Net ...

  2. Mysql数据库导入命令Source详解

    Mysql数据库导入命令Source详解 几个常用用例: 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u root -p dat ...

  3. endif、endforeach

    <?php if ($a == 5): ?>  <div>等于5</div><?php elseif ($a == 6): ?>  <div> ...

  4. 用eclipse javaEE编程时,不管什么程序都会出现这个错误[SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:bookstore' did not find

    用eclipse javaEE编程时,不管什么程序都会出现这个错误[SetContextPropertiesRule]{Context} Setting property 'source' to 'o ...

  5. Js解析json

    var sysModule=[];            var treeJson = <%=(sysModule) %>;            if (treeJson.length ...

  6. 我的第一篇——nginx+naxsi总结篇1

    今天是我正式在Linux下安装nginx的第一天吧,搜索,查看,安装,这之间肯定是或多或少的遇到了很多的问题,不管是大的还是小的,都应该记录下来,或许以后还会用到,或许会帮到其他人. 首先,先说一下, ...

  7. 微信、微博、qq图标服务实现

    实现原理:变化前的图标和变化后的图标在一张图片上,用这张图片作为背景,通过定义背景的位置来实现显示哪个图标,其中还带着滑动的动画效果. <!DOCTYPE html> <html l ...

  8. javascript优化工具 Doloto

    Doloto是“Download Time Optimizer”的简写.官方页面上说它对于大型复杂的AJAX应用尤其的有用,因为这些应用包含了大量的 JavaScript 代码.简单的说,它的工作原理 ...

  9. wireshark的ubuntu更新ppa源

    默认的ppa源安装的是1.8.3的,这个源直接更新到1.11.0 $ sudo add-apt-repository ppa:dreibh/ppa $ sudo apt-get update $ su ...

  10. php中的作用域

    在php中分为局部变量.全局变量和静态变量: 局部变量就是在函数体内声明的变量,例子: <?php  //作用域  $a=5;  function show($b){   $a=$b;//相当于 ...