POJ 3070 Fibonacci

题意:求斐波那契数列第n项,mod10000。

解法:矩阵快速幂。矩阵递推式题里都给了……真贴心……不过我觉得第一个矩阵的第二行有点多余,就给擅自省了……嗯……

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
const int mod = 10000;
void MUL(int a, int b, int c, int x[][2], int y[][2])
{
    int res[2][2] = {0};
    for(int i = 0; i < a; i++)
        for(int j = 0; j < c; j++)
            for(int k = 0; k < b; k++)
                res[i][j] = (res[i][j] + x[i][k] * y[k][j]) % mod;
    for(int i = 0; i < a; i++)
        for(int j = 0; j < b; j++)
            x[i][j] = res[i][j];
}
int POW(int n)
{
    int x[1][2] = {1, 0};
    int base[2][2] = {1, 1, 1, 0};
    while(n)
    {
        if(n & 1)
            MUL(1, 2, 2, x, base);
        MUL(2, 2, 2, base, base);
        n >>= 1;
    }
    return x[0][1];
}
int main()
{
    int n;
    while(~scanf("%d", &n) && ~n)
    {
        printf("%d
", POW(n));
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Apro/p/4857508.html