POJ - 3070. Fibonacci

发布于 2024-08-06 09:58:05 字数 1899 浏览 21 评论 0

题目

解析

关键在于推导出递推式,也就是左边是一个 A 矩阵, B 一般是一个列向量;

类似的规律:

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {

  static class Matrix{
    public int row;
    public int col;
    public int[][] m;

    public Matrix(int row, int col) {
      this.row = row;
      this.col = col;
      m = new int[row][col];
    }
  }

  static final int mod = 10000;


  static Matrix mul(Matrix a,Matrix b){
    Matrix c = new Matrix(a.row,b.col); //注意这里

    for(int i = 0; i < a.row; i++){
      for(int j = 0; j < b.col; j++){
        for(int k = 0; k < a.col; k++)
          c.m[i][j] = (c.m[i][j] + a.m[i][k]*b.m[k][j]) % mod;
      }
    }
    return c;
  }

  static Matrix pow(Matrix a,int k){
    Matrix res = new Matrix(a.row,a.col); // 方阵
    for(int i = 0; i < a.row; i++)
      res.m[i][i] = 1;
    while(k > 0){
      if( (k&1) != 0)
        res = mul(res,a);
      a = mul(a,a);
      k >>= 1;
    }
    return res;
  }

  public static void main(String[] args) {
    Scanner cin = new Scanner(new BufferedInputStream(System.in));

    while(cin.hasNext()){
      int n = cin.nextInt();
      if( n == -1)break;
      if(n == 0){
        System.out.println(0);
        continue;
      }

      Matrix a = new Matrix(2,2);
      a.m[0][0] = a.m[0][1] = a.m[1][0] = 1;
      a.m[1][1] = 0;

      Matrix res = pow(a,n-1);

      System.out.println(res.m[0][0] % mod);
    }
  }

}

题目链接

http://poj.org/problem?id=3070

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

友欢

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文