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. php实用函数整理

    1. 排序:array_multisort 可以对多位数组的多个字段进行排序 例子1如下: //自定义数组排序--按转发数从高到低排序 function sortSelfRc($oneLayer){ ...

  2. win7如何共享文件 图文教你设置win7文件共享

    点评:win7文件共享已成为网友们之间的热议,接下来为大家分享下如何共享文件,首先开启guest账户( 开始菜单 → 运行 → services.msc → 双击 server 服务项 ,设置启动类型 ...

  3. 优化sql,返回行数少情况下,NL比hash快好多

    sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...

  4. iOS之pch文件的正确使用

    在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件 ...

  5. Hibernate学习笔记--------3.缓存

    一.一级缓存 一级缓存又称为“Session缓存”或者“会话级缓存”,通过Session从数据库查询实体时,会把实体在内存中存储起来,下一次查询同一实体时不再再次执行sql语句查询数据库,而是从内存中 ...

  6. Linux与windows文件乱码问题

    Linux与windows文件乱码问题 */--> Linux与windows文件乱码问题 Table of Contents 1. 简介 2. iconv详解 2.1. iconv –help ...

  7. Java中处理Linux信号量

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5976361. ...

  8. 关于MapReduce

    MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算.概念“Map(映射)”和“Reduce(归纳)”,及他们的主要思想,都是从函数式编程语言借来的,还有从矢量 ...

  9. php json_encode转JSON 编码显示中文

    对变量进行 JSON 编码显示中文 /**context":"/u2345/u43245/u2345 转成中文显示 * 对变量进行 JSON 编码[{"time" ...

  10. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序

    如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置.参考配置如下:<?xml version="1.0" enco ...