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. docker——数据卷volume:文件共享

    volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享? 数据卷volume功能特性 数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和 ...

  2. flink 流式处理中如何集成mybatis框架

    flink 中自身虽然实现了大量的connectors,如下图所示,也实现了jdbc的connector,可以通过jdbc 去操作数据库,但是flink-jdbc包中对数据库的操作是以ROW来操作并且 ...

  3. nyoj 41-三个数从小到大排序(STL --> sort(a, a+n) 升序)

    41-三个数从小到大排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:31 submit:44 题目描述: 现在要写一个程序,实现给三个数排序的功 ...

  4. 力扣(LeetCode)键盘行 个人题解

    给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", "Dad& ...

  5. 解决FirewallD is not running问题

    centos7 1.查看firewalld状态:systemctl status firewalld,如果是dead状态,即防火墙未开启. 2.开启防火墙systemctl start firewal ...

  6. 总结:mysql的各种增删改查!

    (原创总结)分为数据库的增删改查,数据表(和字段)的增删改查,数据的增删改查 三部分!// 创建用户并授权 GRANT SELECT ON bodydb.user TO us@localhost ID ...

  7. zabbix 发送报警邮件

  8. PowerDesigner从安装到同步数据库

    前言 最近项目在如火如荼的进行着4.0版本的数据库设计工作,我们几个后端小伙伴也马不停蹄的进行着数据库的设计.使用的设计软件是PowerDesigner,这里记录一些常见的问题以备日后查看 安装 链接 ...

  9. 【Luogu P1502】窗口的星星

    Luogu P1502 题意很好理解,就是问给出的矩形套住的最大和. 但是做起来却十分麻烦. --来自疯狂爆10分的愤怒 一个比较高效的思路是--把每一个星星作为左下角向右上方拓展形成一个矩形, 拓展 ...

  10. 【POJ 2823】【Luogu P1886】Sliding Window 滑动窗口

    POJ 2823 Luogu P1886 [解题思路] 这是一个单调队列算法的经典题目,几乎学习单调队列的人都接触过这题. 利用单调队列算法求出每一个固定区间内的最(大/小)值. 以下以最大值为例: ...