佳佳的斐波那契

佳佳的斐波那契

佳佳对数学,尤其对数列十分感兴趣。

在研究完 Fibonacci 数列后,他创造出许多稀奇古怪的数列。

例如用 S(n) 表示 Fibonacci 前 n 项和 mod m 的值,即 S(n)=(F1+F2++Fn)modm,其中 F1=F2=1,Fi=Fi1+Fi2

可这对佳佳来说还是小菜一碟。

终于,她找到了一个自己解决不了的问题。

T(n)=(F1+2F2+3F3++nFn)modm 表示 Fibonacci 数列前 n 项变形后的和 mod m 的值。

现在佳佳告诉你了一个 nm,请求出 T(n) 的值。

输入格式

共一行,包含两个整数 nm

输出格式

共一行,输出 T(n) 的值。

数据范围

1n,m2311

输入样例:

5 5

输出样例:

1

样例解释

T(5)=(1+2×1+3×2+4×3+5×5)mod5=1

 

解题思路

  首先我们知道如果要求斐波那契数列的前n项和Sn=i=1nfi,可以通过构造向量Fn=[fnfn+1Sn],以及矩阵A=[010111001],得到Fn+1=Fn×A,从而通过递推与矩阵乘法的结合律得到Fn=F0×An,这样就可以得到Sn了。

  对于这题的Tn如果直接构造矩阵A的话会发现元素含有变量,这样每一项的A都不一样,无法得到An这种形式。尝试构造(1)Pn=nSnTn=(n1)f1+(n2)f2++fn1(2)Pn+1=(n+1)Sn+1Tn+1=nf1+(n1)f2++fn

  (2)(1)得到Pn+1Pn=f1+f2++fn=Sn,即Pn=Pn1+Sn。同时根据Pn=nSnTn得到Tn=nSnPn,因此可以构造Fn=[fnfn+1SnPn]A=[0100111000110001],那么就会有[fnfn+1SnPn]×[0100111000110001]=[fn+1fn+2Sn+1Pn+1]=Fn+1

  因此有递推式Fn=F0×An,其中F0=[0100]

  AC代码如下,时间复杂度为O(43×logn)

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int mod;
 5 int a[4][4] = {
 6     {0, 1, 0, 0},
 7     {1, 1, 1, 0},
 8     {0, 0, 1, 1},
 9     {0, 0, 0, 1}
10 };
11 
12 void mul(int c[][4], int a[][4], int b[][4]) {
13     int tmp[4][4] = {0};
14     for (int i = 0; i < 4; i++) {
15         for (int j = 0; j < 4; j++) {
16             for (int k = 0; k < 4; k++) {
17                 tmp[i][j] = (tmp[i][j] + 1ll * a[i][k] * b[k][j]) % mod;
18             }
19         }
20     }
21     memcpy(c, tmp, sizeof(tmp));
22 }
23 
24 int main() {
25     int n;
26     scanf("%d %d", &n, &mod);
27     int f[4][4] = {0, 1, 0, 0}, k = n;
28     while (k) {
29         if (k & 1) mul(f, f, a);
30         mul(a, a, a);
31         k >>= 1;
32     }
33     printf("%d", ((1ll * n * f[0][2] - f[0][3]) % mod + mod) % mod);
34     
35     return 0;
36 }
复制代码

 

参考资料

  AcWing 1304. 佳佳的斐波那契(算法提高课):https://www.acwing.com/video/715/

posted @   onlyblues  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
历史上的今天:
2021-03-28 Complete Binary Search Tree
Web Analytics
点击右上角即可分享
微信分享提示