第一次接触矩阵快速幂
懂了大题的思想
矩阵推理的时候有点问题
这题是我们求出
向上三角行的个数
套用学长的图
序号 | 向上的三角形个数 | 向下的三角形个数 |
---|---|---|
0 | 1 | 0 |
1 | 3 | 1 |
2 | 10 | 6 |
3 | 36 | 28 |
不难观察出规律 ,规律如下
. | 递推公式 |
---|---|
向上的三角 | shang[i]=3*shang[i-1]+xia[i-1] |
向下的三角 | xia[i]=3*xia[i-1]+shang[i-1]; |
然后我们就可以知道了
我们需要的矩阵是
3 | 1 |
1 | 3 |
#include<stdio.h>
#define MOD 1000000007
#define ll long long
struct nana
{
ll m[2][2];
} h,l;
nana juzhen(nana a,nana b)
{
nana 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;
}
ll zzz(ll n)
{
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
h.m[i][j]=(i==j);
}
}
l.m[0][0]=3;
l.m[0][1]=1;
l.m[1][0]=1;
l.m[1][1]=3;
while(n)
{
if(n%2==1)
h=juzhen(h,l);
l=juzhen(l,l);
n=n/2;
}
return h.m[0][0];
}
int main()
{
ll n;
while(~scanf("%lld",&n))
{
printf("%lld\n",zzz(n));
}
}