luogu P1939 【模板】矩阵加速(数列)

本文介绍了一种利用矩阵快速幂的方法来加速求解特定数列的问题。通过定义特定的矩阵并利用快速幂运算,可以高效地计算出数列中任一位置的值。这种方法适用于递推关系明确且可以通过矩阵乘法定义的数列。

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

二次联通门 : luogu P1939 【模板】矩阵加速(数列)

 

 

 

 

/*
    luogu P1939 【模板】矩阵加速(数列)

    模板题不说什么
   许久不写代码。。
感觉好别扭
*/ #include <cstring> #include <cstdio> #define Mod 1000000007 void read (long long &now) { now = 0; register char word = getchar (); while (word < '0' || word > '9') word = getchar (); while (word >= '0' && word <= '9') { now = now * 10 + word - '0'; word = getchar (); } } struct Martix { static const int _L = 3; long long data[_L][_L]; Martix operator * (const Martix &now) const { Martix res; for (register int i = 0, j, k; i < _L; i ++) for (j = 0; j < _L; j ++) { res.data[i][j] = 0; for (k = 0; k < _L; k ++) res.data[i][j] = (res.data[i][j] + this->data[i][k] * now.data[k][j]) % Mod; } return res; } void Fill () { for (register int i = 0, j; i < _L; i ++) for (j = 0; j < _L; j ++) this->data[i][j] = 0; this->data[0][2] = 1; this->data[1][0] = 1; this->data[2][1] = 1; this->data[2][2] = 1; } }; Martix operator ^ (Martix now, long long P) { Martix Answer; memset (Answer.data, 0, sizeof Answer.data); Answer.data[0][0] = 1; Answer.data[1][1] = 1; Answer.data[2][2] = 1; for (; P; P >>= 1) { if (P & 1) Answer = Answer * now; now = now * now; } return Answer; } long long N; int main (int argc, char *argv[]) { long long T; Martix A; for (read (T); T --; ) { read (N); if (N <= 3 && N > 0) { putchar ('1'); putchar ('\n'); continue; } else if (N <= 0) { putchar ('0'); putchar ('\n'); continue; } N -= 3; A.Fill (); A = A ^ N; printf ("%lld\n", (A.data[2][0] + A.data[2][1] + A.data[2][2]) % Mod); } return 0; }

 

转载于:https://www.cnblogs.com/ZlycerQan/p/7161549.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值