题目描述

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

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

解法

一开始看到这道题以为是组合数,求\(C^{n-1}_{n+1}\),但是在这个图上可能会出现环,我们需要保证所有的答案都是能够联通所有的点,那么就不能这样做。
那么我们就打一个表,发现答案是斐波那契变形,\(f[i]=f[i-1]\times 3-f[i-2]+2\)。
这道题的公式推导其实是一个生成树计数,其实老实说我真的不会这个东西,但是这篇博客讲的非常非常非常清楚:orz
这道题还需要用到高精度,我的高精度模板是来自网络上的,(不要喷我QwQ)

ac代码

  1. # include <bits/stdc++.h>
  2. # define ms(a,b) memset(a,b,sizeof(a))
  3. # define ri (register int)
  4. # define inf (0x7f7f7f7f)
  5. # define pb push_back
  6. # define fi first
  7. # define se second
  8. # define pii pair<int,int>
  9. # define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
  10. using namespace std;
  11. inline int gi(){
  12. int w=0,x=0;char ch=0;
  13. while(!isdigit(ch)) w|=ch=='-',ch=getchar();
  14. while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
  15. return w?-x:x;
  16. }
  17. struct BigInteger {
  18. typedef unsigned long long LL;
  19. static const int BASE = 100000000;
  20. static const int WIDTH = 8;
  21. vector<int> s;
  22. BigInteger& clean(){while(!s.back()&&s.size()>1)s.pop_back(); return *this;}
  23. BigInteger(LL num = 0) {*this = num;}
  24. BigInteger(string s) {*this = s;}
  25. BigInteger& operator = (long long num) {
  26. s.clear();
  27. do {
  28. s.push_back(num % BASE);
  29. num /= BASE;
  30. } while (num > 0);
  31. return *this;
  32. }
  33. BigInteger& operator = (const string& str) {
  34. s.clear();
  35. int x, len = (str.length() - 1) / WIDTH + 1;
  36. for (int i = 0; i < len; i++) {
  37. int end = str.length() - i*WIDTH;
  38. int start = max(0, end - WIDTH);
  39. sscanf(str.substr(start,end-start).c_str(), "%d", &x);
  40. s.push_back(x);
  41. }
  42. return (*this).clean();
  43. }
  44. BigInteger operator + (const BigInteger& b) const {
  45. BigInteger c; c.s.clear();
  46. for (int i = 0, g = 0; ; i++) {
  47. if (g == 0 && i >= (int)s.size() && i >= (int) b.s.size()) break;
  48. int x = g;
  49. if (i < s.size()) x += s[i];
  50. if (i < b.s.size()) x += b.s[i];
  51. c.s.push_back(x % BASE);
  52. g = x / BASE;
  53. }
  54. return c;
  55. }
  56. BigInteger operator - (const BigInteger& b) const {
  57. assert(b <= *this);
  58. BigInteger c; c.s.clear();
  59. for (int i = 0, g = 0; ; i++) {
  60. if (g == 0 && i >= s.size() && i >= b.s.size()) break;
  61. int x = s[i] + g;
  62. if (i < b.s.size()) x -= b.s[i];
  63. if (x < 0) {g = -1; x += BASE;} else g = 0;
  64. c.s.push_back(x);
  65. }
  66. return c.clean();
  67. }
  68. BigInteger operator * (const BigInteger& b) const {
  69. int i, j; LL g;
  70. vector<LL> v(s.size()+b.s.size(), 0);
  71. BigInteger c; c.s.clear();
  72. for(i=0;i<s.size();i++) for(j=0;j<b.s.size();j++) v[i+j]+=LL(s[i])*b.s[j];
  73. for (i = 0, g = 0; ; i++) {
  74. if (g ==0 && i >= v.size()) break;
  75. LL x = v[i] + g;
  76. c.s.push_back(x % BASE);
  77. g = x / BASE;
  78. }
  79. return c.clean();
  80. }
  81. BigInteger operator / (const BigInteger& b) const {
  82. assert(b > 0);
  83. BigInteger c = *this;
  84. BigInteger m;
  85. for (int i = s.size()-1; i >= 0; i--) {
  86. m = m*BASE + s[i];
  87. c.s[i] = bsearch(b, m);
  88. m -= b*c.s[i];
  89. }
  90. return c.clean();
  91. }
  92. BigInteger operator % (const BigInteger& b) const {
  93. BigInteger c = *this;
  94. BigInteger m;
  95. for (int i = s.size()-1; i >= 0; i--) {
  96. m = m*BASE + s[i];
  97. c.s[i] = bsearch(b, m);
  98. m -= b*c.s[i];
  99. }
  100. return m;
  101. }
  102. int bsearch(const BigInteger& b, const BigInteger& m) const{
  103. int L = 0, R = BASE-1, x;
  104. while (1) {
  105. x = (L+R)>>1;
  106. if (b*x<=m) {if (b*(x+1)>m) return x; else L = x;}
  107. else R = x;
  108. }
  109. }
  110. BigInteger& operator += (const BigInteger& b) {*this = *this + b; return *this;}
  111. BigInteger& operator -= (const BigInteger& b) {*this = *this - b; return *this;}
  112. BigInteger& operator *= (const BigInteger& b) {*this = *this * b; return *this;}
  113. BigInteger& operator /= (const BigInteger& b) {*this = *this / b; return *this;}
  114. BigInteger& operator %= (const BigInteger& b) {*this = *this % b; return *this;}
  115. bool operator < (const BigInteger& b) const {
  116. if (s.size() != b.s.size()) return s.size() < b.s.size();
  117. for (int i = s.size()-1; i >= 0; i--)
  118. if (s[i] != b.s[i]) return s[i] < b.s[i];
  119. return false;
  120. }
  121. bool operator >(const BigInteger& b) const{return b < *this;}
  122. bool operator<=(const BigInteger& b) const{return !(b < *this);}
  123. bool operator>=(const BigInteger& b) const{return !(*this < b);}
  124. bool operator!=(const BigInteger& b) const{return b < *this || *this < b;}
  125. bool operator==(const BigInteger& b) const{return !(b < *this) && !(b > *this);}
  126. };
  127. ostream& operator << (ostream& out, const BigInteger& x) {
  128. out << x.s.back();
  129. for (int i = x.s.size()-2; i >= 0; i--) {
  130. char buf[20];
  131. sprintf(buf, "%08d", x.s[i]);
  132. for (int j = 0; j < strlen(buf); j++) out << buf[j];
  133. }
  134. return out;
  135. }
  136. istream& operator >> (istream& in, BigInteger& x) {
  137. string s;
  138. if (!(in >> s)) return in;
  139. x = s;
  140. return in;
  141. }
  142. # define N 105
  143. BigInteger f[N];
  144. int main(){
  145. int n = gi ();
  146. f[1]=1; f[2]=5;
  147. for (int i=3;i<=n;i++) f[i]=f[i-1]*3-f[i-2]+2;
  148. cout<<f[n]<<endl;
  149. return 0;
  150. }

[luogu2144][bzoj1002][FJOI2007]轮状病毒【高精度+斐波那契数列+基尔霍夫矩阵】的更多相关文章

  1. 洛谷——P2626 斐波那契数列(升级版)矩阵

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数). 题目描述 ...

  2. HDU1250 高精度斐波那契数列

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  3. poj3070 求斐波那契数列第n项 ——矩阵快速幂

    题目:http://poj.org/problem?id=3070 用矩阵快速幂加速递推. 代码如下: #include<iostream> #include<cstdio> ...

  4. [BSGS算法]纯水斐波那契数列

    学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...

  5. HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Li ...

  6. P1349 广义斐波那契数列(矩阵乘法)

    题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...

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

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

  8. bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Statu ...

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

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

随机推荐

  1. JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现

    十年河东,十年河西,莫欺少年穷. 学无止境,精益求精. 突然发现整个十月份自己还没有写一篇博客......哎,说出来都是泪啊,最近加班实在实在实在是太多了,真的没有多余的时间写博客.这不,今天也在加班 ...

  2. openMP多线程编程

    OpenMP(Open Muti-Processing) OpenMP缺点: 1:作为高层抽象,OpenMp并不适合需要复杂的线程间同步和互斥的场合: 2:另一个缺点是不能在非共享内存系统(如计算机集 ...

  3. JVM规范系列第4章:Class文件格式

    这一章节讲的是字节码的整个组成格式,读懂了这一章,就读懂了字节码文件.对于这一章的学习,我更推荐作为工具书去查找.最好是找一个最简单的Hello World例子,一个字节一个字节去分析其含义.在分析过 ...

  4. SQL行转列汇总 (转)

    PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )A ...

  5. Error【0007】:zabbix中因为curl版本过低而无法发送邮件

    1. 错误背景 在centos6.5上,源码部署zabbix最新版本zabbix-3.2.14.部署后之后,在配置邮件发送报警时出错 2. 错误提示 3. 原因分析 从网上检索的结果是说,系统中的cu ...

  6. A. Make a triangle!

    题意 给你三条边a,b,c问使得构成三角形,需要增加的最少长度是多少 思路 数学了啦 代码 #include<bits/stdc++.h> using namespace std; #de ...

  7. ajax跨域请求数据

    最近开始接触ajax的跨域请求问题,相比网上说的一大堆,我这里就说得比较浅显了. 关于为什么要跨域这个问题,实际的需求是当网站项目部署在一个域名上的时候,分域可以很好地解决网站卡顿问题(拥有多台服务器 ...

  8. ASP.NET Web Service 标准SOAP开发案例代码(自定义验证安全头SOAPHeader)

    using System.Xml;using System.Xml.Serialization;using System.Web.Services.Protocols;using System.Con ...

  9. Docker(十九)-Docker监控容器资源的占用情况

    启动一个容器并限制资源 启动一个centos容器,限制其内存为1G ,可用cpu数为2 [root@localhost ~]# docker run --name os1 -it -m 1g --cp ...

  10. [转帖]总结ORACLE系统视图及表大全

    总结ORACLE系统视图及表大全:dba_开头.....dba_users 数据库用户信息dba_segments 表段信息dba_extents 数据区信息dba_objects 数据库对象信息db ...