hrbust 1430 矩阵快速幂

第一次接触矩阵快速幂

懂了大题的思想

矩阵推理的时候有点问题

这题是我们求出

向上三角行的个数

套用学长的图

序号 向上的三角形个数 向下的三角形个数
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];
递推出规律

然后我们就可以知道了

我们需要的矩阵是

31
13
神秘植物
Time Limit: 1000 MSMemory Limit: 65536 K
Total Submit: 89(41 users)Total Accepted: 40(34 users)Rating: Special Judge: No
Description

Leyni有一种神秘的植物,形状是一种“向上”三角形植物,每过一年,每个“向上”三角形植物会变成三个“向上”三角形植物和一个“向下”三角形植物,每个“向下”三角形植物会变成三个“向下”三角形植物和一个“向上”三角形植物。如下图:


Leyni想知道经过n年有多少个“向上”三角形植物。

Input

输入包含多组测试数据。

对于每组测试数据:

1行,包含一个整数n (0 ≤ n ≤ 1018)

处理到文件结束

Output

对于每组测试数据:

1行,输出Leyni拥有多少个“向上”三角形植物。(MOD 1000000007)

Sample Input

1

2

Sample Output

3

10

Author
齐达拉图@HRBUST
剩下的就是套代码了

#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));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值