码迷,mamicode.com
首页 > 其他好文 > 详细

uva10229-模Fibonacci

时间:2016-09-18 23:29:27      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

题目链接 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

标签:

原文地址:http://www.cnblogs.com/ZengWangli/p/5883329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!