# Codeforces 185 A Plant

A. Plant
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Dwarfs have planted a very interesting plant, which is a triangle directed "upwards". This plant has an amusing feature. After one year a triangle plant directed "upwards" divides into four triangle plants: three of them will point "upwards" and one will point "downwards". After another year, each triangle plant divides into four triangle plants: three of them will be directed in the same direction as the parent plant, and one of them will be directed in the opposite direction. Then each year the process repeats. The figure below illustrates this process.

Help the dwarfs find out how many triangle plants that point "upwards" will be in n years.

Input

The first line contains a single integer n (0 ≤ n ≤ 1018) — the number of full years when the plant grew.

Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use cincout streams or the %I64dspecifier.

Output

Print a single integer — the remainder of dividing the number of plants that will point "upwards" in n years by 1000000007 (109 + 7).

Examples
input
1

output
3

input
2

output
10

Note

The first test sample corresponds to the second triangle on the figure in the statement. The second test sample corresponds to the third one.

f(n)=3*f(n-1)+g(n-1)-f(n-1)=2*f(n-1)+g(n-1);

g(n)=4*g(n-1);

#include<stdio.h>
#include<iostream>
#define mod 1000000007
using namespace std;

struct mat
{
long long int m[2][2];
}base;

mat mulmat(mat a,mat b);
mat fast_mod(mat base,long long int n);

int main()
{
long long int n;
while(scanf("%I64d",&n)!=EOF)
{
base.m[0][0]=2;
base.m[0][1]=1;
base.m[1][0]=0;
base.m[1][1]=4;

if(n==0)  printf("1\n");
else
{

mat ans;
ans=fast_mod(base,n-1);
long long int x=((ans.m[0][0]*3)%mod+(ans.m[0][1]*4)%mod)%mod;
printf("%I64d\n",x);
}
}
return 0;
}

mat mulmat(mat a,mat b)
{
int i,j,k;
mat c;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
c.m[i][j]=0;
for(k=0;k<2;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
}
return c;
}

mat fast_mod(mat base,long long int n)
{
mat E,p;
E.m[0][0]=1;
E.m[0][1]=0;
E.m[1][0]=0;
E.m[1][1]=1;
if(n==0)  return E;
else if(n%2==1)
return mulmat(base,fast_mod(base,n-1));
else
{
p=fast_mod(base,n/2);
return mulmat(p,p);
}
}

• 本文已收录于以下专栏：

## codeforce 185 A——Plant

• bobodem
• 2016年03月24日 09:57
• 240

## codeforces #185 A Plant（矩阵快速幂+递推）

• u013013910
• 2014年09月18日 20:53
• 773

## codeforces - 185 - A - Plant 【经典矩阵快速幂】

A. Planttime limit per test2 seconds memory limit per test256 megabytes inputstandard input outpu...
• nobleman__
• 2017年10月27日 19:37
• 41

## 【Codeforces Round #185 (Div. 1) B】 CodeForces 311B Cats Transport

• sdfzyhx
• 2016年07月21日 16:21
• 382

## Codeforces Round #185 (Div. 1) / 311A The Closest Pair (“陷阱”题)

http://codeforces.com/problemset/problem/311/A If we ignore "break", tot will be up to . ...
• synapse7
• 2014年03月15日 13:15
• 1127

## Codeforces Round #185 (Div. 1) E.Biologist 最小割最大流

• Veda_
• 2013年10月23日 15:51
• 639

## Codeforces Round #185(div2)

• yew1eb
• 2013年05月27日 11:02
• 1446

## [PlantSimulation]User Interface应用（一）

Chart(图)前面我们曾经讲过，仿真分为两个过程：一是建立可视化的模型，二是根据建立的模型，通过多次运行，分析运行所产生的数据，以发现系统存在的问题，并进行改进。而在我看来，第二个过程才是重中之重。...
• luolandeygy
• 2017年04月25日 22:01
• 458

## [PlantSimulation]层式结构及其动画设置

• luolandeygy
• 2017年05月01日 10:22
• 644

## 【快速幂】 CodeForces 185A Plant

• u012749539
• 2015年04月08日 18:56
• 366

举报原因： 您举报文章：Codeforces 185 A Plant 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)