[HDU6470] Count(矩阵快速幂)

该博客介绍了如何应用矩阵快速幂的方法解决HDU6470题目。博主指出,通过特定的转换,可以将问题转化为矩阵运算,并提供了矩阵的系数。解答过程中,博主提到了一个名为'ans'的答案矩阵,用于记录计算过程中的系数矩阵'x'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hdu.edu.cn/showproblem.php?pid=6470

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define INF 0x3f3f3f3f;
#define fi first
#define se second
#define MP make_pair
#define PI pair<int,int>
#define lson l,m,rt<<1,ls,rs
#define rson m+1,r,rt<<1|1,ls,rs
#define test printf("here!!!")
using namespace std;
const int mx=6;
const int mod=123456789;
struct Mat
{
    ll a[mx][mx];
};
struct Node
{
    ll a[mx][1];
};
Node Mul(Mat &x,Node &y)
{
    Node t;
    for (int i=0;i<mx;++i) t.a[i][0]=0;
    for (int i=0;i<mx;++i)
        for (int j=0;j<mx;++j)
            t.a[i][0]=(t.a[i][0]+x.a[i][j]*y.a[j][0]%mod)%mod;
    return t;
}
Mat Mul2(Mat &x,Mat &y)//这里只写这一个,不写上面那个也够了。。
{
    Mat t;
    for (int i=0;i<mx;++i)
        for (int j=0;j<mx;++j)
            t.a[i][j]=0;
    for (int i=0;i<mx;++i)
        for (int j=0;j<mx;++j)
            for (int k=0;k<mx;++k)
                t.a[i][j]=(t.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
    return t;
}
Node Mpow(Mat x,ll b)
{
    Node ans={2,1,27,9,3,1};
    while (b)
    {
        if (b&1) ans=Mul(x,ans);
        x=Mul2(x,x);
        b>>=1;
    }
    return ans;
}
int main()
{
    ll n;
    Mat x=
    {
        1,2,1,0,0,0,
        1,0,0,0,0,0,
        0,0,1,3,3,1,
        0,0,0,1,2,1,
        0,0,0,0,1,1,
        0,0,0,0,0,1
    };
    int cas;
    scanf("%d",&cas);
    while (cas--)
    {
        scanf("%lld",&n);
        if (n==1) printf("1\n");
        else printf("%lld\n",Mpow(x,n-2).a[0][0]);
    }
}

此题主要难点在n^{3}怎么算出来。。。不难发现,可以通过{(n-1)}^{3}转换到n^{3},如下

n^{3}={(n-1)}^{3}+{3(n-1)}^{2}+3(n-1)+1

n^{2}={(n-1)}^{2}+2(n-1)+1

n=(n-1)+1

然后就可以做啦。。

矩阵的系数如上面所示

答案矩阵ans所记录的东西为\begin{bmatrix} F(n-1)\\ F(n-2)\\ n^{3}\\ n^{2}\\ n\\ 1 \end{bmatrix},系数矩阵如代码中的Mat x所示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值