[FJOI2007]轮状病毒

Posted mrclr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[FJOI2007]轮状病毒相关的知识,希望对你有一定的参考价值。

嘟嘟嘟

 

这是一篇假题解

 

刚开始这道题我觉得是矩阵树定理,然而好像还得用高斯消元求行列式,不太会呀……然后想了半天dp式也没想出来,看了题解还是不太懂,最后lba,qmcp两人告诉了我一个玄学的方法。

首先f[1] = 1, f[2] = 3,然后像斐波那契一样递推直到第n项,如果n为奇数,就输出f[n] * f[n],偶数就输出f[n] * f[n] - 4……然而并不会证明。最后提醒一下,别忘用高精度。

技术分享图片
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<cctype>
  8 #include<vector>
  9 #include<stack>
 10 #include<queue>
 11 using namespace std;
 12 #define enter printf("
")
 13 #define space printf(" ")
 14 #define Mem(a) memset(a, 0, sizeof(a))
 15 typedef long long ll;
 16 typedef double db;
 17 const int INF = 0x3f3f3f3f;
 18 const int eps = 1e-8;
 19 const int maxn = 105;
 20 const int max_size = 1e3 + 5;
 21 inline ll read()
 22 {
 23     ll ans = 0;
 24     char ch = getchar(), last =  ;
 25     while(!isdigit(ch)) {last = ch; ch = getchar();}
 26     while(isdigit(ch))
 27     {
 28         ans = ans * 10 + ch - 0; ch = getchar();
 29     }
 30     if(last == -) ans = -ans;
 31     return ans;
 32 }
 33 inline void write(ll x)
 34 {
 35     if(x < 0) x = -x, putchar(-);
 36     if(x >= 10) write(x / 10);
 37     putchar(x % 10 + 0);
 38 }
 39 
 40 struct Big
 41 {
 42     int len, a[max_size];
 43     Big() {Mem(a); len = 0;}
 44     void init(int x)
 45     {
 46         for(int i = x; i > 0; i /= 10) a[++len] = i % 10;
 47     }
 48     Big operator + (const Big& b)const
 49     {
 50         Big c;
 51         int l = max(len, b.len); l++; 
 52         for(int i = 1; i <= l; ++i)
 53         {
 54             c.a[i] += (a[i] + b.a[i]) % 10;
 55             c.a[i + 1] += (a[i] + b.a[i]) / 10;
 56         }
 57         while(l && !c.a[l]) l--;
 58         c.len = l;
 59         return c;
 60     }
 61     Big operator * (const Big& b)const
 62     {
 63         Big c;
 64         for(int i = 1; i <= len; ++i)
 65             for(int j = 1; j <= b.len; ++j)
 66             {
 67                 c.a[i + j - 1] += a[i] * b.a[j];
 68                 c.a[i + j] += c.a[i + j - 1] / 10;
 69                 c.a[i + j - 1] %= 10;
 70             }
 71         int l = len + b.len;
 72         while(l && !c.a[l]) l--;
 73         c.len = l;
 74         return c;
 75     }
 76     Big operator - (const Big& b)
 77     {
 78         int l = max(len, b.len);
 79         for(int i = 1; i <= l; ++i)
 80         {
 81             if(a[i] < b.a[i]) {a[i + 1]--; a[i] += 10;}
 82             a[i] -= b.a[i];
 83         }
 84         while(l && !a[l]) l--;
 85         len = l;
 86         return *this;
 87     }
 88     void out()
 89     {
 90         for(int i = len; i > 0; --i) write(a[i]);
 91     }
 92 };
 93 
 94 int n;
 95 Big f[maxn], _4, ans;
 96 
 97 int main()
 98 {
 99     n = read();
100     f[2].init(3); f[1].init(1); _4.init(4);
101     for(int i = 3; i <= n; ++i) f[i] = f[i - 1] + f[i - 2];
102     ans = (n & 1) ? f[n] * f[n] : f[n] * f[n] - _4;
103     ans.out(); enter;
104     return 0;
105 }
View Code

 

以上是关于[FJOI2007]轮状病毒的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1002 FJOI2007 轮状病毒

P2144 [FJOI2007]轮状病毒

BZOJ 1002 [FJOI2007]轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒

BZOJ 1002: [FJOI2007]轮状病毒