Codeforces 185A.Plant

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)=3f(n1)+g(n1)g(n)=3g(n1)+f(n1)
其中 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)=22n1+2n1

  有了通项同时,我们就可以直接计算,方法就是快速幂

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值