Description
给定n(N<=100),编程计算有多少个不同的n轮状病毒。
Input
第一行有1个正整数n。
Output
将编程计算出的不同的n轮状病毒数输出
Sample Input
3
Sample Output
16
基尔霍夫矩阵(我也不知道是什么)推出f[i]=(f[i-1]*3-f[i-2]+2)
给定一个有n个顶点的图G,它的拉普拉斯矩阵
定义为:
L=D-A
其中D为图的度矩阵,A为图的
邻接矩阵。度矩阵在有向图中,只需要考虑出度或者入度中的一个。经过计算可以得
1、若i
=j,则
2、若i≠ j,但顶点
和顶点
相邻,则
3、其它情况
也可以将这三种值通过除以
进行标准化。
code:
#include<iostream>
#include<cstdio>
using
namespace
std
;
struct
data
{
int
a
[
101
]
,
len
;
}
;
int
n
;
data
mul
(
data
a
,
int
k
)
{
for
(
int
i
=
1
;
i
<=
a
.
len
;
i
++
)
a
.
a
[
i
]
*=
k
;
for
(
int
i
=
1
;
i
<=
a
.
len
;
i
++
)
{
a
.
a
[
i
+
1
]
+=
a
.
a
[
i
]
/
10
;
a
.
a
[
i
]
%=
10
;
}
if
(
a
.
a
[
a
.
len
+
1
]
!=
0
)
a
.
len
++
;
return
a
;
}
data
sub
(
data
a
,
data
b
)
{
a
.
a
[
1
]
+=
2
;
int
j
=
1
;
while
(
a
.
a
[
j
]
>=
10
)
{
a
.
a
[
j
]
%=
10
;
a
.
a
[
j
+
1
]
++
;
j
++
;
}
for
(
int
i
=
1
;
i
<=
a
.
len
;
i
++
)
{
a
.
a
[
i
]
-=
b
.
a
[
i
]
;
if
(
a
.
a
[
i
]
<
0
)
{
a
.
a
[
i
]
+=
10
;
a
.
a
[
i
+
1
]
--
;
}
}
while
(
a
.
a
[
a
.
len
]
==
0
)
a
.
len
--
;
return
a
;
}
int
main
(
)
{
data
f
[
101
]
;
f
[
1
]
.
a
[
1
]
=
1
;
f
[
2
]
.
a
[
1
]
=
5
;
f
[
1
]
.
len
=
f
[
2
]
.
len
=
1
;
scanf
(
"%d"
,
&n
)
;
for
(
int
i
=
3
;
i
<=
n
;
i
++
)
f
[
i
]
=
sub
(
mul
(
f
[
i
-
1
]
,
3
)
,
f
[
i
-
2
]
)
;
for
(
int
i
=
f
[
n
]
.
len
;
i
>
0
;
i
--
)
printf
(
"%d"
,
f
[
n
]
.
a
[
i
]
)
;
return
0
;
}