[BZOJ1002] [FJOI2007] 轮状病毒 (基尔霍夫矩阵)

Description

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

Input

第一行有1个正整数n。

Output

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

Sample Input

3

Sample Output

16

HINT

Source

Solution

  基尔霍夫矩阵,左转生成树的计数及其应用

  推出本题的递推式:f[n] = f[n - 1] * 3 - f[n - 2] + 2

  如果你能看懂,拜托给我讲讲,本人不懂。

  注意要使用高精度

 1 #include <cstring>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 struct bigint
 6 {
 7     int a[55];
 8
 9     bigint()
10     {
11         memset(a, 0, sizeof(a));
12     }
13
14     bigint operator + (int rhs)
15     {
16         bigint ans;
17         for(int i = 0; i <= a[0]; i++)
18             ans.a[i] = a[i];
19         ans.a[0]++, ans.a[1] += rhs;
20         for(int i = 1; i < ans.a[0]; i++)
21         {
22             ans.a[i + 1] += ans.a[i] / 10;
23             ans.a[i] %= 10;
24         }
25         while(!ans.a[ans.a[0]])
26             ans.a[0]--;
27         return ans;
28     }
29
30     bigint operator - (bigint rhs)
31     {
32         bigint ans;
33         ans.a[0] = a[0];
34         for(int i = 1; i <= ans.a[0]; i++)
35             ans.a[i] = a[i] - rhs.a[i];
36         for(int i = 1; i < ans.a[0]; i++)
37             if(ans.a[i] < 0)
38             {
39                 ans.a[i] += 10;
40                 ans.a[i + 1] -= 1;
41             }
42         while(!ans.a[ans.a[0]])
43             ans.a[0]--;
44         return ans;
45     }
46
47     bigint operator * (int rhs)
48     {
49         bigint ans;
50         ans.a[0] = a[0] + 1;
51         for(int i = 1; i <= ans.a[0]; i++)
52             ans.a[i] = a[i] * rhs;
53         for(int i = 1; i < ans.a[0]; i++)
54         {
55             ans.a[i + 1] += ans.a[i] / 10;
56             ans.a[i] %= 10;
57         }
58         while(!ans.a[ans.a[0]])
59             ans.a[0]--;
60         return ans;
61     }
62
63 }f[105];
64
65 int main()
66 {
67     int n;
68     cin >> n;
69     f[1].a[1] = 1, f[2].a[1] = 5;
70     f[1].a[0] = f[2].a[0] = 1;
71     for(int i = 3; i <= n; i++)
72         f[i] = f[i - 1] * 3 - f[i - 2] + 2;
73     for(int i = f[n].a[0]; i; i--)
74         cout << f[n].a[i];
75     cout << endl;
76     return 0;
77 }

时间: 2024-12-23 18:56:34

[BZOJ1002] [FJOI2007] 轮状病毒 (基尔霍夫矩阵)的相关文章

[bzoj1002][FJOI2007]轮状病毒-题解[基尔霍夫矩阵][高精度][递推]

Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 Sample Input

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

1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Status] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 HINT Source 基尔霍夫矩阵总算编出来了,这道题考

bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元

基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1    5    16    45    121 320 841     2205   5776 15125 39601  103680  271441    710645      1860496 第1.3.5.7...[奇数位]位是平方数 : 1*1  4*4  11*11   29*29   76*76   199*199  521*521... 第2.4.6.8...[偶数位]位除以5后也是平

hdu4305Lightning 生成树计数(基尔霍夫矩阵)+高斯消元+逆元

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4305 题意:比较裸的生成树计数问题. 如何处理生成树计数问题? 基尔霍夫矩阵: if i==j  Kir[i][j] = i的度数 if i!=j   Kir[i][j] = i到j的平行边的个数的负数 即,基尔霍夫矩阵 = 度数矩阵 - 邻接矩阵 将基尔霍夫矩阵删去第i行和第i列,余下i-1阶的行列式的值即为生成树个数.(证明略) 求行列式的值可以将行列式转为上三角阵,求对角线上的积即为行列式的值.

无向图生成树计数 基尔霍夫矩阵 SPOJ Highways

基尔霍夫矩阵 https://blog.csdn.net/w4149/article/details/77387045 https://blog.csdn.net/qq_29963431/article/details/51236064 题目链接  https://vjudge.net/problem/SPOJ-HIGH AC代码 1 #include <bits/stdc++.h> 2 #define pb push_back 3 #define mp make_pair 4 #define

BZOJ 1002: [FJOI2007]轮状病毒 递推/基尔霍夫矩阵树定理

f[n]=3*f[n-1]-f[n-2]+2 1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2959  Solved: 1644 [Submit][Status][Discuss] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Outpu

BZOJ 1002 + SPOJ 104 基尔霍夫矩阵 + 一个递推式。

BZOJ 1002 高精度 + 递推 f[1] = 1; f[2] = 5; f[i] = f[i - 1] * 3 - f[i - 2] + 2; SPOJ 104 裸 + 不用Mod 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 7 using namespace std;

生成树的计数(基尔霍夫矩阵):UVAoj 10766 Organising the Organisation SPOJ HIGH - Highways

HIGH - Highways In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of citi

BZOJ1002: [FJOI2007]轮状病毒 (DP)

标准做法似乎应该是计算生成树数量的基尔霍夫矩阵之类的.. 我看到的做法是一个神奇的高精度dp,当然以后这个blahblahblah矩阵还是要搞一下.. 参考(抄袭)网址 这个dp的原理就是把环拆成一条含特定点的链和剩下部分(可用dp解决),这样就避免了环具有的一些dp不好解决的奇怪判定. 非常神奇 %想出这个办法的dalao 附上非常不走心的非常丑的自己的代码.. 1 #include<cmath> 2 #include<cstdio> 3 #include<cstring&