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

求第n个斐波那契数模一个数的值 

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

public class Main{
    static int mod;
    public static void main(String[] args){
        quickin in = new quickin();
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
        int n = in.nextInt();
        mod = in.nextInt();
        matrix m = new matrix(0,1,1,1);
        matrix ans = qpow(m,n-1);
        System.out.println((ans.a1+ans.a2)%mod);
    }
    public static matrix mul(matrix x, matrix y){
        int i = (x.a1*y.a1+x.a2*y.b1)%mod;
        int j = (x.a1*y.a2+x.a2*y.b2)%mod;
        int k = (x.b1*y.a1+x.b2*y.b1)%mod;
        int l = (x.b1*y.a2+x.b2*y.b2)%mod;
        return new matrix(i,k,j,l);
    }
    public static matrix qpow(matrix a, int n){
        matrix ans = new matrix(1,0,0,1);
        while(n!=0){
            if((n&1)==1){
                ans=mul(ans,a);
            }
            a=mul(a,a);
            n=n>>1;
        }
        return ans;
    }
}
class quickin{
    BufferedReader br;
    StringTokenizer st;
    quickin(){
        br = new BufferedReader(new InputStreamReader(System.in));
    }
    boolean hasNext(){
        while(st==null||!st.hasMoreElements()){
            try{
                st = new StringTokenizer(br.readLine());
            }catch(Exception e){
                return false;
            }
        }
        return true;
    }
    String next(){
        if(hasNext()) return st.nextToken();
        return null;
    }
    int nextInt(){
        return Integer.parseInt(next());
    }
}

class matrix{
    int a1;
    int b1;
    int a2;
    int b2;
    public matrix(int a1, int b1, int a2, int b2) {
        this.a1 = a1;
        this.b1 = b1;
        this.a2 = a2;
        this.b2 = b2;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值