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. unicode 编码总结

    unicode简介: unicode又称为unicode character set,缩写为ucs,意为字符集.编码方式有utf-7,utf-8,utf-16,utf-32几种,常用的是utf-8和u ...

  2. if elseif else

    1)if,else if需要接判断表达式,只有在满足条件的时候执行而else语句是在前面条件都不满足的时候才能执行(2) 一个if...else if...else语句中可以有多个else if语句, ...

  3. iOS实用的小技巧

    1.快捷键 上传APP模拟器截图:comm+s 自动保存到桌面 2.storyboard 改型号尺寸 如从iPad改为iPhone6:

  4. WebSocket原理及与http1.0/1.1 long poll和 ajax轮询的区别【转自知乎】

    一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的ke ...

  5. MSP430电平转换

    说道到这个电平转换,写程序的时候居然还要示波器来观察现象,表示我们交的是211的学费,上的却不是211大学,创新实验室的仪器设备真的是少的可怜啊,我级不吐槽了说说这个电平转换的一些知识还有看法吧.. ...

  6. hdu 1095 A+B for Input-Output Practice (VII)

    A+B for Input-Output Practice (VII) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32 ...

  7. [转载]删除所有的.svn文件夹

    Windows 下,在DOS窗口中运行如下命令 dos 代码 for /r <你项目的路径> %i in (.svn) do rd /s /q %i Linux 下,可以先运行 显示出当前 ...

  8. 使用Keil建立工程和烧录到89C52板上

    又开始学习C51了,不清楚能坚持多久,之前学过一段时间,学完P1口就没再学了,之前学的都忘了. 1. 使用Keil 进行建立工程:打开Keil 4. 加载C文件进工程里面 然后展开"Sour ...

  9. (转)战斗bug技巧全攻略

    原文地址:http://www.cnblogs.com/manuosex/p/3736077.html 程序员不是有一幅这样的对联吗 上联:一个项目两部电脑三餐盒饭只为四千工资搞得五脏俱损六神无主仍然 ...

  10. Dremel made simple with Parquet

    http://lastorder.me/tag/parquet.html https://blog.twitter.com/2013/dremel-made-simple-with-parquet 对 ...