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

来源:互联网 发布:方维o2o上门服务 源码 编辑:程序博客网 时间:2024/05/20 20:21

题目大意:要求输出第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;}
0 0
原创粉丝点击