实施矩阵求幂时出错

时间:2018-06-20 22:50:32

标签: java exponentiation

我尝试使用geeksforgeeks上的文章中的解释来实现快速取幂,但在解决时却显示错误: https://www.spoj.com/problems/FIBOSUM/

任何人都可以解释代码有什么问题吗? 我尝试通过计算给定范围的最后一个元素的斐波那契总和和范围开始之前的元素的斐波那契总和并减去它们,但是显示出错误且错误的答案。

import java.util.*;
import java.io.*;

class GFG {

    public static int fib(int n) {
        if(n<=1)
        return n;
        int f[][] = new int[][]{{1,1},{1,0}};
        int g = power(f,n-1);
        return g;

    }

    public static int power(int f[][],int n){
        int b[][] = new int[][]{{1,1},{1,0}};
        int sum = 1;
        for(int i = 2;i<=n;i++){
            multiply(f,b);
            sum = sum+f[0][0];
        }
        return((sum+1)%1000000007);
    }

    public static void multiply(int f[][],int b[][]){
        int x = f[0][0]*b[0][0]+f[0][1]*b[1][0];
        int y = f[0][0]*b[0][1]+f[0][1]*b[1][1];
        int z = f[1][0]*b[0][0]+f[1][1]*b[1][0];
        int w = f[1][0]*b[0][1]+f[1][1]*b[1][1];
        f[0][0] = x;
        f[0][1] = y;
        f[1][0] = z;
        f[1][1] = w;

    }
    public static void main (String[] args) throws Exception {
        Scanner s = new Scanner(System.in);
        int t = s.nextInt();
        for(int i = 1;i<=t;i++){
            int n = s.nextInt();
            int m = s.nextInt();
            if(n!=0)
                n = fib(n-1);
            m = fib(m);
           System.out.println((m-n)%1000000007);

        }
    }
}

1 个答案:

答案 0 :(得分:0)

您必须注意负片(m-n + MOD)%MOD