1 题目描述(题目链接)
2 题解
设第
n
n
n年向上的三角形个数为
f
(
n
)
f(n)
f(n),向下的三角形个数为
g
(
n
)
g(n)
g(n),根据题目描述,每一个向上的三角形在下一年会产生三个向上的和一个向下的,每一个向下的三角形在县一年会产生三个向下的和一个向上的。因此可以得到下述关系:
{
f
(
n
)
=
3
∗
f
(
n
−
1
)
+
g
(
n
−
1
)
g
(
n
)
=
3
∗
g
(
n
−
1
)
+
f
(
n
−
1
)
\begin{cases} f(n) = 3*f(n-1)+g(n-1)\\ g(n) = 3*g(n-1)+f(n-1) \end{cases}
{f(n)=3∗f(n−1)+g(n−1)g(n)=3∗g(n−1)+f(n−1)
其中
n
=
0
,
1
,
2
,
⋯
n=0,1,2,\cdots
n=0,1,2,⋯,且
f
(
0
)
=
1
,
g
(
0
)
=
0
f(0) = 1,g(0) = 0
f(0)=1,g(0)=0。同时我们知道第
n
n
n年的三角形总数为
4
n
4^n
4n,即:
f
(
n
)
+
g
(
n
)
=
4
n
f(n) + g(n) = 4^n
f(n)+g(n)=4n
结合三个式子我们可以得到:
f
(
n
)
=
2
2
n
−
1
+
2
n
−
1
f(n) = 2^{2n-1} + 2^{n-1}
f(n)=22n−1+2n−1
有了通项同时,我们就可以直接计算,方法就是快速幂。
n = int(input())
m = 1000000007
def qmod(a, k):
res = 1
a %= m
while k:
if k & 1:
res = res * a % m
k //= 2
a = a**2 % m
return res
res = qmod(2, n)
print(res*(res + 1)//2 % m)
#include <iostream>
using namespace std;
typedef long long ll;
const ll m = 1000000007;
ll qmod(ll a, ll k){
ll res = 1;
a %= m;
while(k >= 1){
if (k & 1)
res = a * res % m;
k >>= 1;
a = a * a % m;
}
return res;
}
int main(int argc, const char * argv[]) {
// insert code here...
ll n, res;
cin>>n;
res = qmod(2, n);
cout<<res*(res+1)/2%m<<endl;
return 0;
}