HDU - 3117 Fibonacci Numbers 矩阵快速幂 + 取大数前4位

题目大意:要求输出第n个fibonacci数,如果该数超过1e9,就输出该数的前4位和后四位

解题思路:通过打表可得,第40个fibonacci数是大于1e9的,所以40之前的可以直接计算

40之后的比较麻烦,参考了别人的题解

http://blog.sina.com.cn/s/blog_9bf748f301019q3t.html

#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 2;
struct Matrix{
    int mat[N][N];
}A, B, tmp;
int n;

Matrix matMul(Matrix x, Matrix y, int mod) {
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++) {
            tmp.mat[i][j] = 0;
            for(int k = 0; k < N; k++)
                tmp.mat[i][j] += x.mat[i][k] * y.mat[k][j] % mod;
            tmp.mat[i][j] %= mod;
        }
   return tmp;
}

void solve(int mod) {
    while(n) {
        if(n & 1)
            B = matMul(B,A,mod);
        A = matMul(A,A,mod);
        n >>= 1;
    }
}

void init() {
    B.mat[0][0] = B.mat[1][1] = 1;
    A.mat[0][0] = A.mat[0][1] = A.mat[1][0] = 1;
    B.mat[0][1] = B.mat[1][0] = A.mat[1][1] = 0;
}

int main() {
    while(scanf("%d", &n) != EOF) {
        init();
        if(n == 0)
            printf("0\n");
        else if(n == 1)
            printf("1\n");
        else {
            init();
            if(n <= 39) {
                n -= 1;
                solve(1e9);
                printf("%d\n", B.mat[0][0]);
            }
            else {
                double t;
                double s = (sqrt(5.0) + 1.0) / 2;
                t = -0.5 * log(5.0) / log(10.0) + ((double)n) * log(s)/ log(10.0);
                t -= floor(t);
                t = pow(10.0,t);
                while(t < 1000)
                    t *= 10;
                n--;
                solve(10000);
                printf("%04d...%04d\n", int(t), B.mat[0][0]);
            }
        }
    }
    return 0;
}
时间: 2024-10-14 17:30:16

HDU - 3117 Fibonacci Numbers 矩阵快速幂 + 取大数前4位的相关文章

HDU 3117 Fibonacci Numbers(矩阵快速幂+公式)

题目地址:HDU 3117 对于后四位可以用矩阵快速幂快速求出来,但前四位就没办法了.要知道斐波那契数列是有通项公式的,所以只能通过通项公式来求前四位,但公式不能求后四位,因为公式使用浮点数求的,精度显然不够,求前四位要用到对数. 通项公式为: f(n)=1/sqrt(5)(((1+sqrt(5))/2)^n+((1-sqrt(5))/2)^n) 假设F[n]可以表示成 t * 10^k(t是一个小数),那么对于F[n]取对数log10,答案就为log10 t + K,此时很明显log10 t<

HDU - 2855 Fibonacci Check-up 矩阵快速幂

题目大意: F函数是fibonacci函数,F(0) = 0,F(1) = 1 解题思路:这题我也不会推,打表可以得到结论... G(n) = 3 * G(n-1) - G(n-2),G函数表示 这题要注意最后求得的可能是负数,所以最后要处理一下 #include<cstdio> typedef long long ll; const int N = 2; struct Matrix { int mat[N][N]; }A, B, tmp; int n, m; void init() { A.

HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵快速幂)

HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵快速幂) ACM 题目地址:HDU 3117 Fibonacci Numbers 题意: 求第n个斐波那契数的前四位和后四位. 不足8位直接输出. 分析: 前四位有另外一题HDU 1568,用取对的方法来做的. 后四位可以用矩阵快速幂,MOD设成10000就行了. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * Blog: http://blog.csdn.

HDU - 1588 Gauss Fibonacci (矩阵快速幂+二分求等比数列和)

Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. " How good an opportunity that Gardon can not give up! The "Prob

hdu 1588 Gauss Fibonacci(矩阵快速幂)

Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2090    Accepted Submission(s): 903 Problem Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

hdu 2817 A sequence of numbers(快速幂取余)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2817 题目大意:给出三个数,来判断是等差还是等比数列,再输入一个n,来计算第n个数的值. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #define m 200907 5 6 using namespace std; 7 8 __int64 fun(__int64 j,__int64 k) 9

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

http://acm.hdu.edu.cn/showproblem.php?pid=4965 利用相乘的可结合性先算B*A,得到6*6的矩阵,利用矩阵快速幂取模即可水过. 1 #include<iostream> 2 #include<stdio.h> 3 #include<iostream> 4 #include<stdio.h> 5 #define N 1010 6 #define M 1010 7 #define K 6 8 using namespa

hdu 3117 Fibonacci Numbers

点击此处即可传送到hdu 3117 **Fibonacci Numbers** Problem Description The Fibonacci sequence is the sequence of numbers such that every element is equal to the sum of the two previous elements, except for the first two elements f0 and f1 which are respectively