首页 > 其他分享 >P1962 斐波那契数列(矩阵快速幂)

P1962 斐波那契数列(矩阵快速幂)

时间:2024-01-25 16:33:32浏览次数:28  
标签:数列 int long 斐波 那契 P1962

	#include<bits/stdc++.h>
	#define int long long
	using namespace std;
	int n,a[3],m=1e9+7,c[3][3],b[3][3],x[3][3],a1[3];
	void first()
	{
	    for(int i=1;i<=2;i++)
	    	for(int j=1;j<=2;j++) x[i][j]=0;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            for(int k=1;k<=2;k++)
	                x[i][j]=(x[i][j]+b[i][k]*c[k][j])%m;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            b[i][j]=x[i][j];
	}
	void second()
	{
	    for(int i=1;i<=2;i++)
	    	for(int j=1;j<=2;j++) x[i][j]=0;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            for(int k=1;k<=2;k++)
	                x[i][j]=(x[i][j]+c[i][k]*c[k][j])%m;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            c[i][j]=x[i][j];
	}
	signed main()
	{
	    a[1]=1;
	    a[2]=1;
	    scanf("%ld",&n);
	    if(n<=2){cout<<1;return 0;}else n-=2;
	    for(int i=1;i<=2;i++) b[i][i]=1;
	    for(int i=1;i<=2;i++){
	        for(int j=1;j<=2;j++) if(!(i==2&&j==2)) c[i][j]=1;
		}
	    while(n)
	    {
	        if(n%2==1) first();
	        n/=2;
	        second();
	    }
		for(int i=1;i<=2;i++)
	   		for(int j=1;j<=2;j++)
	       		a1[i]=(a1[i]+b[i][j]*a[j])%m;
		cout<<a1[1];
	    return 0;
	}

标签:数列,int,long,斐波,那契,P1962
From: https://www.cnblogs.com/wenzhihao2023/p/17987456

相关文章

  • 算法学习Day38斐波那契数、爬楼梯
    Day38斐波那契数、爬楼梯ByHQWQF2024/01/22笔记509.斐波那契数斐波那契数,通常用 F(n)表示,形成的序列称为斐波那契数列。该数列由 0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1) =1F(n)=F(n-1)+F(n-2),其中n>1给你n,请计算F(......
  • AcWing 717. 简单斐波那契
    AcWing717.简单斐波那契以下数列01123581321...被称为斐波纳契数列。这个数列从第33项开始,每一项都等于前两项之和。输入一个整数\(N\),请你输出这个序列的前\(N\)项。输入格式一个整数\(N\)。输出格式在一行中输出斐波那契数列的前\(N\)项,数字之间用......
  • 时间复杂度(斐波那契)和空间复杂度
    1.0时间复杂度(斐波那契)//计算阶层递归Fac的时间复杂度longlongFac(size_tN){if(0==N)return1;returnFac(N-1)*N;}该算法的时间复杂度度很稳定:O(N)//计算斐波那契数列递归Fib的时间复杂度longlongFib(size_tN){if(N<3)return1;returnFib(N-1)+......
  • Halo2简单使用-斐波那契数列
    电路设计Halo2是基于PLONK算法的零知识证明框架,使用Rust语言。在Halo2中要证明你掌握斐波那契数列,例如Fib(10)=55。则需要将你的每一步计算过程(秘密的)罗列出来。并由程序(电路)来进行验证,生成证明。在PLONK算法里,我们使用表格来进行计算跟踪,例如:abc112123235358581381321132134......
  • Halo2简单应用-斐波那契示例
    电路设计Halo2是基于PLONK算法的零知识证明框架,使用Rust语言。在Halo2中要证明你掌握斐波那契数列,例如Fib(10)=55。则需要将你的每一步计算过程(秘密的)罗列出来。并由程序(电路)来进行验证,生成证明。在PLONK算法里,我们使用表格来进行计算跟踪,例如:abr112123......
  • Java-与斐波那契数列相关的变体问题
    变体问题指的是提问的方式不一样了,但是解决问题的方法还是用斐波那契数列来解。——写在前面的话。一、变体1-兔子问题1.问题描述第一个月,有一对未成熟的兔子第二个月上述的一对兔子成熟第三个月,他们能产下一对小兔子所有兔子遵循相同规律,求第n个月的兔子个数2.分析例子假设我要求......
  • Java-用递归的思想求斐波那契数列第n项的值
    一、思想-多路递归多路递归multirecursion就是在每次递归时包含多次(大于一次)的自身调用。也就是一个问题会被拆分成多个子问题。多路递归比单路递归在分析时间复杂度上比较复杂一些。二、斐波那契数列三、例子以n=4为例,当我们用下面(第四部分)的代码实现时,这个多路递归的求解过......
  • C练习题——打印第n个斐波那契数
    斐波那契数列:1123581321...规律:从第三个数开始,第n个数为前两数之和#include<stdio.h>intmain(){intn=0;scanf("%d",&n);inta=1;intb=1;intc=1;while(n>=3){c=a+b;a=b;......
  • 前端歌谣的刷题之路-第一百一十七题-实现斐波那契数列
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 《论取模的艺术》231760:菲波那契数列.递推ver
    原题错误代码:#include<bits/stdc++.h>usingnamespacestd;longlongmath(inta){if(a<=2){return1;}longlongf0=1,f1=1,f2;for(inti=3;i<=a;++i){f2=f1+f0;f0=f1;f1=f2;......