不理解矩阵快速幂如何用于求斐波那契数列第n项%m的余数,In the Fibonacci integer sequence,F0 = 0,F1 = 1,and Fn = Fn − 1 + Fn − 2 for n ≥ 2.For example,the first ten terms of the Fibonacci sequence are:0,1,1,2,3,5,8,1

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/27 20:32:31
不理解矩阵快速幂如何用于求斐波那契数列第n项%m的余数,IntheFibonacciintegersequence,F0=0,F1=1,andFn=Fn−1+Fn−2forn≥

不理解矩阵快速幂如何用于求斐波那契数列第n项%m的余数,In the Fibonacci integer sequence,F0 = 0,F1 = 1,and Fn = Fn − 1 + Fn − 2 for n ≥ 2.For example,the first ten terms of the Fibonacci sequence are:0,1,1,2,3,5,8,1
不理解矩阵快速幂如何用于求斐波那契数列第n项%m的余数,
In the Fibonacci integer sequence,F0 = 0,F1 = 1,and Fn = Fn − 1 + Fn − 2 for n ≥ 2.For example,the first ten terms of the Fibonacci sequence are:
0,1,1,2,3,5,8,13,21,34,…
Given two integers n and m,your goal is to compute the value of Fn mod m.
Input
The input test file will contain multiple test cases.Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000) and m(where 0

不理解矩阵快速幂如何用于求斐波那契数列第n项%m的余数,In the Fibonacci integer sequence,F0 = 0,F1 = 1,and Fn = Fn − 1 + Fn − 2 for n ≥ 2.For example,the first ten terms of the Fibonacci sequence are:0,1,1,2,3,5,8,1
按照正常的逻辑是只要求a[2][2]={1,1,1,0}这个矩阵的n次方就可以得到斐波那契数列的第n项(即a[0][1])的值.但是你忽略了一点,就是你在求a[0][1],a[1][0],a[1][1]的值的时候你的a[0][0]的值其实已经改变了,导致你求得的a[0][1]的值不正确,继而影响到a[1][0]和a[1][1]的值.
因此,我们在遍历这四个值的时候是不能改变其中任何一个的,只有改完之后才能去改变它的值.所以我们可以用几个变量先将求得的新矩阵各值存起来,如下:
#include<stdio.h>
int a[2][2]={1,1,1,0},b[2][2]={1,1,1,0};//使用两个二维数组表示快速幂算法要用到的矩阵
int main()
{
 int n,m,i,j,t,u;
 int a1,a2,a3,a4;
 while(scanf("%d %d",&n,&m)!=EOF)
 {
  if(m==-1 && n==-1)//当输入的m.n值为-1时结束整个算法
   return 0;
  /*以下是对于第n项斐波那契数的计算*/
  if(n==0)
   a[0][0]=0;
  else if(n==1 || n==2)
   a[0][0]=1;
  else
  {
   for(i=3;i<=n;i++)
   {
    a1=a[0][0]*b[0][0]+a[0][1]*b[1][0];
    a2=a[0][0]*b[0][1]+a[0][1]*b[1][1];
    a3=a[1][0]*b[0][0]+a[1][1]*b[1][0];
    a4=a[1][0]*b[0][1]+a[1][1]*b[1][1];
    a[0][0]=a1;
    a[0][1]=a2;
    a[1][0]=a3;
    a[1][1]=a4;
   }
  }
  t=a[0][0];
  a[0][0]=1;//重置矩阵
  a[0][1]=1;
  a[1][0]=1;
  a[1][1]=0;
  if(m==0)
   a[0][0]=0;
  else if(m==1 || m==2)
   a[0][0]=1;
  else
  {
   for(j=3;j<=m;j++)
   {
    a1=a[0][0]*b[0][0]+a[0][1]*b[1][0];
    a2=a[0][0]*b[0][1]+a[0][1]*b[1][1];
    a3=a[1][0]*b[0][0]+a[1][1]*b[1][0];
    a4=a[1][0]*b[0][1]+a[1][1]*b[1][1];
    a[0][0]=a1;
    a[0][1]=a2;
    a[1][0]=a3;
    a[1][1]=a4;
   }
  }
  u=a[0][0];
  a[0][0]=1;//重置矩阵
  a[0][1]=1;
  a[1][0]=1;
  a[1][1]=0;
  t=t%u;
  printf("%d\n",t);
 }
 return 0;
}
 
还有一点,就是你的矩阵相乘后两项写错了,自己对比一下改过来吧.
 
这样就能得到你想要的结果了.

不理解矩阵快速幂如何用于求斐波那契数列第n项%m的余数,In the Fibonacci integer sequence,F0 = 0,F1 = 1,and Fn = Fn − 1 + Fn − 2 for n ≥ 2.For example,the first ten terms of the Fibonacci sequence are:0,1,1,2,3,5,8,1 矩阵乘法快速幂矩阵乘法怎么快速幂啊?例如求斐波那契序列的第i位mod p,如何把那个2*2的矩阵用logn(n为相乘次数)的时间复杂度相乘n次……我笨.求详解 下面是一个矩阵快速幂求解斐波那契数列第n项对第m项取余的程序,但是总是运行出错,.#includeint a[2][2]={1,1,1,0},b[2][2]={1,1,1,0};//使用两个二维数组表示快速幂算法要用到的矩阵int main(){int n,m,i,j,t vb编程,用于计算菲波那契数列的第n项(算菲波那契数列的定义四是这样的,其第i项和第2项都是1,以后每一项等于其前两项之和.) 用C语言求斐波那契数列第n项? 用汇编语言求斐波那契数列第K项 求斐波那契数列的第N项VFP程序 求斐波那契数列第n项值得shell编程? JAVA:求斐波那契数列第n项需求:求斐波那契数列第n项,n MATLAB 数列转化假设A为长度为1000的数列,该数列无规律,如何得到B数列,要求A的第一个数是B的第1000个数,A的第二个数是B的第999个数,依次类推,可否有简便方法?那如何实现矩阵的类似转化啊?比 二次型如何快速转化为矩阵? 请问如何计算斐波那契数列(0.1.1.3.5.)第n项的值,其中n 怎么快速判断幂数列 用非递归的函数调用形式求斐波那契数列第n项 java用递归编程求斐波那契数列第n项 斐波那契数列的第11个数是? 斐波那契数列中的第n个数是多少 斐波那契数列第100项是什么