• POJ 3070 Fibonacci 矩阵高速求法


    就是Fibonacci的矩阵算法。只是添加一点就是由于数字非常大,所以须要取10000模,计算矩阵的时候取模就能够了。

    本题数据不强,只是数值本来就限制整数,故此能够0ms秒了。

    以下程序十分清晰了,由于分开了几个小函数了。适合刚開始学习的人參考下。

    #include <stdio.h>
    
    const int MOD = 10000;
    
    void mulOneMatrix(int F[2][2])
    {
    	int a = F[0][0];
    	int b = F[1][0];
    	F[0][0] = (a+b)%MOD;
    	F[0][1] = a;
    	F[1][0] = a;
    	F[1][1] = b;
    }
    
    inline void mulMat(int LF[2][2], int RF[2][2])
    {
    	int a = LF[0][0] * RF[0][0] + LF[0][1] * RF[1][0];
    	int b = LF[0][0] * RF[0][1] + LF[0][1] * RF[1][1];
    	int c = LF[1][0] * RF[0][0] + LF[1][1] * RF[1][0];
    	int d = LF[1][0] * RF[0][1] + LF[1][1] * RF[1][1];
    	LF[0][0] = a%MOD; LF[0][1] = b%MOD; LF[1][0] = c%MOD; LF[1][1] = d%MOD;
    }
    
    void powMatrix(int F[2][2], int n)
    {
    	if (n <= 1) return;
    
    	powMatrix(F, n>>1);
    	mulMat(F, F);
    	if (n & 1) mulOneMatrix(F);
    }
    
    int calFibonacci(int n)
    {
    	int F[2][2] = { {1, 1}, {1, 0} };//Fn+1, Fn, Fn, Fn-1
    	powMatrix(F, n-1);
    	return F[0][0];
    }
    
    int main()
    {
    	int n;
    	while (scanf("%d", &n) && -1 != n)
    	{
    		if (n == 0) puts("0");
    		else printf("%d
    ", calFibonacci(n));
    	}
    	return 0;
    }



  • 相关阅读:
    Linux中rar解压软件
    Linux中rpm和yum安装软件
    查看nova日志
    po编译为mo;django翻译多义性问题解决
    某服務器開端口
    linux環境查找某文件夾下含有某字符串的所有文件
    gerrit +git使用
    ubuntu 暂时使用root权限
    mysql-求中位数方法
    phonecat-angular.js route.js加载启动失败
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6978175.html
Copyright © 2020-2023  润新知