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);

代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<cstring>
  7 #define PAU putchar(' ')
  8 #define ENT putchar('\n')
  9 #define eps 1e-8
 10 using namespace std;
 11 const int maxn=105;
 12 struct bign{
 13     int len,s[maxn];
 14     bign(){memset(s,0,sizeof(s));len=1;}
 15     bign(int num){*this=num;}
 16     bign(const char *num){*this=num;}
 17     bign operator = (const int num){
 18         char s[maxn];  sprintf(s,"%d",num);
 19         *this = s;return *this;
 20     }
 21     bign operator = (const char *num){
 22         for(int i=0;num[i]=='0';num++);
 23         len=strlen(num);
 24         for(int i=0;i<len;i++) s[i]=num[len-i-1]-'0';
 25         return *this;
 26     }
 27     bign operator + (const bign &b) const{
 28         bign c;c.len=0;
 29         for(int i=0,g=0;g||i<max(len,b.len);i++)  {
 30             int x=g;
 31             if(i<len) x+=s[i];
 32             if(i<b.len) x+=b.s[i];
 33             c.s[c.len++]=x%10;
 34             g=x/10;
 35         } return c;
 36     }
 37     void clean(){while(len > 1 && !s[len-1]) len--;return;}
 38     bign operator * (const bign &b){
 39         bign c;
 40         c.len=len+b.len;
 41         for(int i=0;i<len;i++) for(int j=0;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
 42         for(int i=0;i<c.len;i++){
 43             c.s[i+1]+=c.s[i]/10;
 44             c.s[i]%=10;
 45         } c.clean();return c;
 46     }
 47     bign operator - (const bign &b){
 48         bign c;c.len=0;
 49         for(int i=0,g=0;i<len;i++){
 50             int x=s[i]-g;if(i<b.len) x-=b.s[i];
 51             if(x>=0) g=0;
 52             else g=1,x+=10;
 53             c.s[c.len++]=x;
 54         } c.clean();return c;
 55     }
 56     bign operator / (const bign &b)  {
 57         bign c,f=0;
 58         for(int i=len-1;i>=0;i--){
 59             f=f*10;f.s[0]=s[i];
 60             while(!(f<b)) f=f-b,c.s[i]++;
 61         } c.len=len;c.clean();return c;
 62     }
 63     bign operator % (const bign &b)  {
 64         bign r = *this / b;
 65         r = *this - r*b;
 66         return r;
 67     }
 68     bool operator < (const bign &b)  {
 69         if(len!=b.len) return len<b.len;
 70         for(int i=len-1;i>=0;i--){
 71             if(s[i]!=b.s[i]) return s[i]<b.s[i];
 72         } return false;
 73     }
 74     bool operator > (const bign &b){
 75         if(len!=b.len) return len>b.len;
 76         for(int i=len-1;i>=0;i--){
 77             if(s[i]!=b.s[i]) return s[i]>b.s[i];
 78         } return false;
 79     }
 80     bool operator == (const bign &b){
 81         return !(*this>b)&&!(*this<b);
 82     }
 83     bool operator >= (const bign &b){
 84         return (*this>b)||(*this==b);
 85     }
 86     void print(){
 87         for(int i=len-1;i>=0;i--) putchar(s[i]+'0');return;
 88     }
 89 }f[maxn];
 90 inline int read(){
 91     int x=0,sig=1;char ch=getchar();
 92     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
 93     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
 94     return x*=sig;
 95 }
 96 inline void write(int x){
 97     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
 98     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
 99     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
100 }
101 int n;
102 void init(){
103     n=read();f[1]=1;f[2]=5;
104     return;
105 }
106 void work(){
107     for(int i=3;i<=n;i++) f[i]=f[i-1]*3-f[i-2]+2;
108     return;
109 }
110 void print(){
111     f[n].print();
112     return;
113 }
114 int main(){init();work();print();}

View Code

转载于:https://www.cnblogs.com/songorz/p/10065232.html

BZOJ1002 [FJOI2007]轮状病毒(最小生成树计数)相关推荐

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

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

  2. 洛谷P2144 bzoj1002 [FJOI2007]轮状病毒 (高精度板子)

    P2144 [FJOI2007]轮状病毒 题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间 ...

  3. Bzoj1002 [FJOI2007]轮状病毒

    Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5165  Solved: 2808 Description 轮状病毒有很多变种,所有轮状病毒的变种都是 ...

  4. bzoj1016 [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 6032  Solved: 2452 [Submit][ ...

  5. BZOJ 1016--[JSOI2008]最小生成树计数(kruskal搜索)

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7429  Solved: 3098 [Submit][ ...

  6. 最小生成树计数(洛谷-P4208)

    题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的 ...

  7. 最小生成树计数(HYSBZ-1016)(加强版实现)

    Problem Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最 ...

  8. 最小生成树计数(HYSBZ-1016)(简化版实现)

    Problem Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最 ...

  9. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

    不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

最新文章

  1. 【Python-ML】SKlearn库性能指标ROC-AUC
  2. 【转载】dirs、pushd、popd指令
  3. 一天搞定HTML----标签语义化04
  4. tab翻页导致的问题
  5. codevs4203山区建小学
  6. Java教程:Java程序的运行过程(执行流程)分析
  7. Win11如何禁用USB端口?禁用USB端口的方法
  8. NUC1157 To the Max【最大子段和+DP】
  9. 「SCOI2015」小凸玩密室 解题报告
  10. K8s 使用helm 安装 EFK和ELK分布式日志分析系统系列(es版本:6.7.0;)
  11. 单向链表环测试并返回环起始节点
  12. C#开源爬虫NCrawler源代码解读以及将其移植到python3.2(3)
  13. Android Studio实现简单的图书馆订座系统
  14. 58-20210406华为海思Hi3516DV300的linux系统下获取IMX335的视频(eMMC模式)
  15. 使用树莓派4B最新官方烧录软件烧录镜像设置密码,直接登录wifi
  16. 51单片机自学笔记(一)——keil软件的使用
  17. 《支付机构外汇业务管理办法》正式发布 合作银行不得超过2家
  18. 华为手机相片导入计算机,华为手机如何导出照片到电脑上 来学习吧
  19. matlab:人脸识别
  20. SVN客户端无法连接服务器的问题

热门文章

  1. linux笔记:压缩解压命令gzip,gunzip,tar,zip,unzip,bzip2,bunzip2
  2. 数据库插入时,标识列插入显式值
  3. 自定义堆栈(回文检测)
  4. java中的Random()注意!
  5. 源同步方法与注意事项
  6. 为什么要使用Go语言?Go语言的优势在哪里?
  7. 区块链的安全软肋是什么?
  8. 一个Solidity源文件的布局
  9. kafka streams_如何使用Kafka Streams实施更改数据捕获
  10. todoist 无法登陆_通过构建Todoist克隆将您的React技能提升到一个新的水平