Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 7125  Solved: 3878
[Submit][Status][Discuss]

Description

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

  N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示

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

Input

  第一行有1个正整数n

Output

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

Sample Input

3

Sample Output

16

HINT

题解:基尔霍夫矩阵(我也不知道是什么)推出f[i]=(f[i-1]*3-f[i-2]+2);

代码:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define eps 1e-8
using namespace std;
const int maxn=;
struct bign{
int len,s[maxn];
bign(){memset(s,,sizeof(s));len=;}
bign(int num){*this=num;}
bign(const char *num){*this=num;}
bign operator = (const int num){
char s[maxn]; sprintf(s,"%d",num);
*this = s;return *this;
}
bign operator = (const char *num){
for(int i=;num[i]=='';num++);
len=strlen(num);
for(int i=;i<len;i++) s[i]=num[len-i-]-'';
return *this;
}
bign operator + (const bign &b) const{
bign c;c.len=;
for(int i=,g=;g||i<max(len,b.len);i++) {
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%;
g=x/;
} return c;
}
void clean(){while(len > && !s[len-]) len--;return;}
bign operator * (const bign &b){
bign c;
c.len=len+b.len;
for(int i=;i<len;i++) for(int j=;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
for(int i=;i<c.len;i++){
c.s[i+]+=c.s[i]/;
c.s[i]%=;
} c.clean();return c;
}
bign operator - (const bign &b){
bign c;c.len=;
for(int i=,g=;i<len;i++){
int x=s[i]-g;if(i<b.len) x-=b.s[i];
if(x>=) g=;
else g=,x+=;
c.s[c.len++]=x;
} c.clean();return c;
}
bign operator / (const bign &b) {
bign c,f=;
for(int i=len-;i>=;i--){
f=f*;f.s[]=s[i];
while(!(f<b)) f=f-b,c.s[i]++;
} c.len=len;c.clean();return c;
}
bign operator % (const bign &b) {
bign r = *this / b;
r = *this - r*b;
return r;
}
bool operator < (const bign &b) {
if(len!=b.len) return len<b.len;
for(int i=len-;i>=;i--){
if(s[i]!=b.s[i]) return s[i]<b.s[i];
} return false;
}
bool operator > (const bign &b){
if(len!=b.len) return len>b.len;
for(int i=len-;i>=;i--){
if(s[i]!=b.s[i]) return s[i]>b.s[i];
} return false;
}
bool operator == (const bign &b){
return !(*this>b)&&!(*this<b);
}
bool operator >= (const bign &b){
return (*this>b)||(*this==b);
}
void print(){
for(int i=len-;i>=;i--) putchar(s[i]+'');return;
}
}f[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int n;
void init(){
n=read();f[]=;f[]=;
return;
}
void work(){
for(int i=;i<=n;i++) f[i]=f[i-]*-f[i-]+;
return;
}
void print(){
f[n].print();
return;
}
int main(){init();work();print();}

BZOJ1002 [FJOI2007]轮状病毒(最小生成树计数)的更多相关文章

  1. bzoj1002: [FJOI2007]轮状病毒 生成树计数

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

  2. [bzoj1002][FJOI2007 轮状病毒] (生成树计数+递推+高精度)

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

  3. BZOJ1002 FJOI2007 轮状病毒 【基尔霍夫矩阵+高精度】

    BZOJ1002 FJOI2007 轮状病毒 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原 ...

  4. [bzoj1002][FJOI2007]轮状病毒_递推_高精度

    轮状病毒 bzoj-1002 FJOI-2007 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2 ...

  5. bzoj1002: [FJOI2007]轮状病毒(基尔霍夫矩阵)

    1002: [FJOI2007]轮状病毒 题目:传送门 题解: 决定开始板刷的第一题... 看到这题的时候想:这不就是求有多少种最小生成树的方式吗? 不会啊!!!%题解... 什么鬼?基尔霍夫矩阵?? ...

  6. [BZOJ1002] [FJOI2007] 轮状病毒 (数学)

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

  7. [luogu2144][bzoj1002][FJOI2007]轮状病毒【高精度+斐波那契数列+基尔霍夫矩阵】

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

  8. BZOJ1002[FJOI2007]轮状病毒

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

  9. BZOJ1002:[FJOI2007]轮状病毒(找规律,递推)

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

随机推荐

  1. go中的数据结构字典-map

    1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...

  2. Centos 6/7 常用命令总结 (基础)

    Centos 6/7 常用命令总结 (基础): 参考链接:https://www.cnblogs.com/linhaifeng/p/6045600.html 目录介绍: a) bin目录:用来存放常用 ...

  3. thinkphp5配合datatable插件分页后端处理程序

    thinkphp5配合datatable插件分页后端处理程序第一版DataTable.php v.1.0 <?php use think\Db; /** * DataTable.php. */ ...

  4. 使用 layUI做一些简单的表单验证

    使用 layUI做一些简单的表单验证 <form method="post" class="layui-form" > <input name ...

  5. Jquery才可以使用 this 指定当前DOM

    Jquery才可以使用 this 指定当前DOM jquery获取并设置它的元素 <div class="shop-item" style="line-height ...

  6. lqb 入门训练 A+B问题

    入门训练 A+B问题 时间限制:1.0s   内存限制:256.0MB     问题描述 输入A.B,输出A+B. 说明:在“问题描述”这部分,会给出试题的意思,以及所要求的目标. 输入格式 输入的第 ...

  7. nyoj 94-cigarettes (分清楚,那一部分的cigarettes是用过的,那一部分是没有用过的)

    94-cigarettes 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:20 难度:2 题目描述: Tom has many cigarettes. We hypo ...

  8. mysql 索引笔记

    MyISAM引擎的B+Tree的索引 通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下: 所有的非叶子节点中存储的全部是索引信息 在叶子节点中存储的 value值其实是 数据库中 ...

  9. ZeroC ICE的远程调用框架 ServantLocator与Locator

    ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...

  10. centos 生成网卡UUID

    在Linux或CentOS中,可以通过如下命令获取网卡的uuid信息: uuidgen 网卡名07d07031-eb0f-4691-8606-befb46645433 查看网卡UUID nmcli c ...