思路转载:http://blog.youkuaiyun.com/mengxiang000000/article/details/50962375
题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1430
代码:
#include<stdio.h>
#include<string.h>
#define MOD 1000000007
using namespace std;
struct point
{
long long int m[2][2];
}ans,base;
point mliti(point a,point b)
{
point temp;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
temp.m[i][j]=0;
for(int k=0;k<2;k++)
{
temp.m[i][j]=(temp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
}
}
}
return temp;
}
long long int fast(long long int n)
{
base.m[0][0]=base.m[1][1]=3;
base.m[0][1]=base.m[1][0]=1;
ans.m[0][0]=ans.m[1][1]=1;
ans.m[0][1]=ans.m[1][0]=0;
while(n)
{
if(n%2==1)
ans=mliti(ans,base);
base=mliti(base,base);
n=n/2;
}
return ans.m[0][0];
}
int main()
{
long long int t;
while(~scanf("%lld",&t))
{
printf("%lld\n",fast(t));
}
}
算是一种类型题吧。
先找规律,
我们用Fn表示蓝色(向上)的三角形,用Sn来表示白色(向下)的三角形,
N | 0 | 1 | 2 | 3 | 4 |
Fn | 1 | 3 | 10 | 36 | 36*3+28 |
Sn | 0 | 1 | 6 | 28 | 28*3+36 |
即:Fn=Fn-1*3+Sn-1
Sn=Sn-1*3+Fn-1。
3 1 Fn-1 0 Fn
* =
? ? Sn-1 1 ?
Sn=Sn-1*3+Fn-1
3 1 Fn-1 0 Fn
* =
1 3 Sn-1 1 Sn
3 1 ^n = Fn ?
1 3 Sn ?