首页 > 其他分享 >佳佳的 Fibonacci

佳佳的 Fibonacci

时间:2023-06-10 20:47:25浏览次数:70  
标签:num matrix 表格 佳佳 矩阵 nf base Fibonacci

目录

题目链接


题目描述

image


私货:《消失点》——洛天依\Icelter。

做题思路

1.我推它的公式

双倍题解给下一位
首先,\(f_i=f_{i-1}+f_{i-2}\)
其次,\(T_i=T_{i-1}+if_i\)
易得,\(T_i=T_{i-1}+nf_{n-1}+nf_{n-2}\)
所以我们考虑如何使用base来转换出\(T_i\)

2.我搞它的矩阵

我们的base一定包含那么五个元素,分别是:
\(T_{i-1}\)、\(nf_{i-1}\)、\(nf_{i-2}\)、\(f_i-1\)、\(f_{i-2}\)
那么我们先列出一个表格,表格的第一行是这五个元素,第一列是a*base后得到的元素。
表格里的1表示相加

\(T_n-1\) \(nf_{n-1}\) \(nf_{n-2}\) \(f_{n-1}\) \(f_{n-2}\)
\(T_i\) 1 1 1
\(n+1f_n\) 1 1 1 1
\(n+1f_{n-1}\) 1 1
\(f_{n}\) 1 1
\(f_{n-1}\) 1

根据矩阵乘法中的一些东西:
关于矩阵乘中的矩阵乘行向量或列向量
我们可以知道,首先5*5的矩阵相乘,要使左矩阵的行向量乘右矩阵的列向量得到第一个元素\(T_i\)
那么就要让上述表格的第一行作为行向量是乘号左边的矩阵,倒置表格使表格的数是:
1 0 0 0 0
1 1 1 0 0
1 1 0 0 0
0 1 1 1 1
0 1 0 1 0
作为乘号右边的矩阵。
或者说我们让上述表格的第一行是列向量作为乘号右边的矩阵,不倒表格作为乘号左边的矩阵。
我们以第一种做法为例
再来推初始矩阵n=3很好推叭
3 3 3 1 1


代码实现

Miku's Code
#include<bits/stdc++.h>
using namespace std;

const int maxn=2147483647;
typedef long long intx;

int n,m; 
intx ans;

struct matrix{
	intx num[8][8];
	matrix clear(){memset(num,0,sizeof(num));}
};matrix a,base;

matrix operator*(matrix &x,matrix &y){
	matrix res;
	res.clear();
	for(int k=1;k<=5;++k){
		for(int i=1;i<=5;++i){
			for(int j=1;j<=5;++j){
				res.num[i][j]=(res.num[i][j]+x.num[i][k]*y.num[k][j]%m)%m; 
			}
		}
	}
	return res;
}

void pre(){
	base.clear();
	base.num[1][1]=1;
	base.num[2][1]=base.num[2][2]=base.num[2][3]=1;
	base.num[3][1]=base.num[3][2]=1;
	base.num[4][2]=base.num[4][3]=base.num[4][4]=base.num[4][5]=1;
	base.num[5][2]=base.num[5][4]=1;
	a.num[1][1]=a.num[1][2]=a.num[1][3]=3;
	a.num[1][4]=a.num[1][5]=1;
}

void get(int k){
	while(k){
		if(k&1)	a=a*base;
		k=k>>1;
		base=base*base; 
	}
}

void input(){
	scanf("%d%d",&n,&m);
}

int main(){
	input();
	pre();
	if(n==1){
		printf("1");
		return 0;
	}
	if(n==2){
		printf("3");
		return 0;
	}
	n-=2;
	get(n);
	intx ans=a.num[1][1]%m;
	printf("%lld\n",ans);
	return 0;
} 

标签:num,matrix,表格,佳佳,矩阵,nf,base,Fibonacci
From: https://www.cnblogs.com/sonnety-v0cali0d-kksk/p/17471895.html

相关文章

  • 佳佳的 Fibonacci 题解
    佳佳的Fibonacci题解题目:题解:数据范围很大,暴力超时,考虑的是矩阵优化递推,关键是求出递推矩阵,然后结合矩阵快速幂求解如何求解递推矩阵?我们首先知道斐波那契的递推式:f[i]=f[i-1]+f[i-2]——>①然后题目中给我们了T(n)的递推式:T(n)=F[1]+2F[2]+3F[3]+...+nF[n]——>②考......
  • 从蓝桥杯来谈Fibonacci数列
    2014年蓝桥杯的第九题是这样描述的:     给定Fibonacci数列F[],其中,,求表达式      的值。其中在讲解这道题之前,我们先来看一个简单版的。题目如下:题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1194分析:可以看出本题就是直接求,虽然这里的......
  • CF446C. DZY Loves Fibonacci Numbers
    好牛的题,写一下。题意:维护一个序列\(a\),长度为\(n\),有\(m\)次操作:1lr:对于\(i\in[l,r]\),\(a_i\leftarrowa_i+f_{i-l+1}\)。2lr:求\(\displaystyle\left(\sum_{i=l}^ra_i\right)\bmod(10^9+9)\)。其中\(f_{i}\)表示第\(i\)个斐波那契数(\(f_0=0,f_1=1,f_n=f_......
  • 【CF446C】DZY Loves Fibonacci Numbers(线段树)
    Description给定一个序列,资瓷区间加上一个斐波那契数列,区间求和。Solution有一个性质:fib[a+b]=fib[a−1]×fib[b]+fib[a]×fib[b+1]fib[a+......
  • HDU 1588 Gauss Fibonacci(矩阵快速幂)
    题目地址:HDU1588用于构造斐波那契的矩阵为1,11,0设这个矩阵为A。sum=f(b)+f(k+b)+f(2*k+b)+f(3*k+b)+........+f((n-1)*k+b)<=>sum=A^b+A^(k+b)+A^(2*k+b)+A^(3*k+b)+........+A^((n-1)*k+b)<=>sum=A^b+A^b*(A^k+A^2*k+A^3*k+.......+A^((n-1)*k))(1)设矩阵B为A^k;那么(1......
  • HDU 3306 Another kind of Fibonacci(矩阵快速幂)
    题目地址:HDU3306没什么智商的题目,只要把构造矩阵硬算出来就行。代码如下:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<queue>#include<......
  • 6-1 使用函数输出指定范围内Fibonacci数的个数
    本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目。所谓Fibonacci数列就是满足任一项数字是......
  • UVA-12333 Fibonacci的复仇 题解答案代码 算法竞赛入门经典第二版
    ​​GitHub-jzplp/aoapc-UVA-Answer:算法竞赛入门经典例题和习题答案刘汝佳第二版​​算法竞赛入门经典书中给出了大数类的算法,直接照抄即可。我的做题过程:1.照着书......
  • Fibonacci 第 n 项
     #include<iostream>#include<cmath>#include<algorithm>usingnamespacestd;#defineN2intmod;#defineintlonglongstructmatrix{ ......
  • HDOJ1021 Fibonacci Again
    题目链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1021​​这个题最坑的莫过于范围了,开始用long,测试了下,发现很快就超范围了。然后想着使用大数,考虑到时间的限制,再次......