zoukankan      html  css  js  c++  java
  • poj 3070 Fibonacci

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

      入门级矩阵快速幂,自己打了个属于自己的模板!

    View Code
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 typedef __int64 ll;
     8 const int mod = 10000;
     9 const int matSize = 100;
    10 
    11 struct Matrix {
    12     ll val[matSize][matSize];
    13 
    14     Matrix(bool Init = false) {
    15         for (int i = 0; i < matSize; i++) {
    16             for (int j = 0; j < matSize; j++) {
    17                 val[i][j] = 0;
    18             }
    19             if (Init) val[i][i] = 1;
    20         }
    21     }
    22 
    23 
    24     void print() {
    25         for (int i = 0; i < matSize; i++) {
    26             for (int j = 0; j < matSize; j++) {
    27                 printf("%I64d ", val[i][j]);
    28             }
    29             puts("");
    30         }
    31         puts("~~~");
    32     }
    33 } Base;
    34 
    35 Matrix operator * (Matrix _a, Matrix _b) {
    36     Matrix ret = Matrix();
    37 
    38     for (int i = 0; i < matSize; i++) {
    39         for (int k = 0; k < matSize; k++) {
    40             if (_a.val[i][k]) {
    41                 for (int j = 0; j < matSize; j++) {
    42                     ret.val[i][j] += _a.val[i][k] * _b.val[k][j];
    43                     ret.val[i][j] %= mod;
    44                 }
    45             }
    46         }
    47     }
    48 
    49     return ret;
    50 }
    51 
    52 Matrix operator ^ (Matrix _a, ll _p) {
    53     Matrix ret = Matrix(true);
    54 
    55     while (_p) {
    56         if (_p & 1) {
    57             ret = ret * _a;
    58         }
    59         _a = _a * _a;
    60         _p >>= 1;
    61     }
    62 
    63     return ret;
    64 }
    65 
    66 void initBase(ll _k = 1, ll _a = 1) {
    67     Base.val[0][1] = _k;
    68     Base.val[1][1] = _a;
    69     Base.val[0][0] = 0;
    70     Base.val[1][0] = 1;
    71 }
    72 
    73 ll fun(ll _x) {
    74     Matrix ret = Matrix();
    75 
    76     ret.val[0][0] = 0;
    77     ret.val[0][1] = 1;
    78 
    79     ret = ret * (Base ^ _x);
    80 //    ret.print();
    81 
    82     return ret.val[0][0];
    83 }
    84 
    85 ll deal(ll _x) {
    86     return fun(_x);
    87 }
    88 
    89 int main() {
    90     ll n;
    91 
    92     initBase();
    93 //    Base.print();
    94     while (~scanf("%I64d", &n) && ~n) {
    95         printf("%I64d\n", deal(n));
    96     }
    97 
    98     return 0;
    99 }

    ——wirtten by Lyon

  • 相关阅读:
    Java中获取键盘输入值的三种方法
    java多线程处理与数据集合
    Apachetomcat学习
    Java之枚举
    多例设计模式与枚举
    权限管理(数据库部分)
    hdu 2458(最大独立集)
    hdu 1507(最大匹配)
    hdu 1350+hdu 1960(最小路径覆盖)
    hdu 1845(最大匹配)
  • 原文地址:https://www.cnblogs.com/LyonLys/p/poj_3070_Lyon.html
Copyright © 2011-2022 走看看