AcWing 1304. 佳佳的斐波那契
. 佳佳的斐波那契
一、题目描述
佳佳对数学,尤其对数列十分感兴趣。
在研究完 数列后,她创造出许多稀奇古怪的数列。
例如用 表示 前 项和 的值,即 ,其中 。
可这对佳佳来说还是小菜一碟。
终于,她找到了一个自己解决不了的问题。
用 表示 数列前 项变形后的和 的值。
现在佳佳告诉你了一个 和 ,请求出 的值。
输入格式
共一行,包含两个整数 和 。
输出格式
共一行,输出 的值。
数据范围
输入样例:
输出样例:
样例解释
二、推导过程
我们需要利用构造新的数列,从而消去变量,最后再反解出:
令
② 式 - ① 式
于是我们只需维护如下矩阵即可
有如下等式:
然后直接使用矩阵快速幂便可以求解
初始矩阵
递推式
答案
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N = 4;
int n, mod;
// 矩阵乘法
void mul(int a[][N], int b[][N], int c[][N]) {
int t[N][N] = {0};
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
for (int k = 0; k < N; k++)
t[i][j] = (t[i][j] + (a[i][k] * b[k][j]) % mod) % mod;
}
memcpy(c, t, sizeof t);
}
int main() {
int b[N][N] = {1, 1, 1, 0};
int m[N][N] = {
{1, 1, 1, 0},
{1, 0, 0, 0},
{0, 0, 1, 1},
{0, 0, 0, 1}};
cin >> n >> mod;
for (int i = n - 1; i; i >>= 1) {
if (i & 1) mul(b, m, b);
mul(m, m, m);
}
int t = (n * b[0][2]) - b[0][3];
t = (t % mod + mod) % mod;
printf("%lld\n", t);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2013-06-04 省内转学出错的解决办法