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(竖式加法模拟 & 字典树)
UVA 11582 - Colossal Fibonacci Numbers!(数论)(分治法幂取模)
uva 11582 Colossal Fibonacci Numbers!