uva10229-模Fibonacci

Posted 啊嘞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva10229-模Fibonacci相关的知识,希望对你有一定的参考价值。

题目链接 http://vjudge.net/problem/UVA-10229

 

解题思路

一开始想到一种O(n)的算法,就是每次只算fib的二进制后m位,然后就TLE了。。。

 比较正确的解法是用矩阵快速幂。大概是O(log(n))的算法,对任何数据都很快。。。

要注意n=0的情况。。。

 

代码

#include<stdio.h>
#include<string.h>
typedef long long ll;
ll ans[2][1], t[2][2] = {1}, s[2][2];
ll base[2][2] = {0, 1, 1, 1};
ll mod;
void copy(ll a[][2], ll b[][2])
{
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
            a[i][j] = b[i][j];
}
void mul(ll a[][2], ll b[][2], ll c[][2])
{
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++) 
            a[i][j] = 0;
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
            for(int k=0; k<2; k++)
                a[i][j] += (b[i][k] * c[k][j]) % mod;
}
int cal(ll n)
{
    if(n == 1) copy(s, base);
    else {
        cal(n/2);
        copy(t, s);
        mul(s, t, t);
        if(n % 2 == 1){
            mul(t, s, base);
            copy(s, t);
        }
    }
}
int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m) == 2) {
        if(n >= 1) {
            mod = 1 << m; cal(n);
            printf("%d\n", s[0][1]%mod);
        }
        else printf("0\n");
    }
    return 0;
}    

 

以上是关于uva10229-模Fibonacci的主要内容,如果未能解决你的问题,请参考以下文章

UVA-12333 Revenge of Fibonacci(竖式加法模拟 & 字典树)

UVa12333 Revenge of Fibonacci

UVA 11582 - Colossal Fibonacci Numbers!(数论)(分治法幂取模)

uva 11582 Colossal Fibonacci Numbers!

UVA-12333 Revenge of Fibonacci

UVa 11582 - Colossal Fibonacci Numbers!(数论)