设为首页 加入收藏

TOP

UVA10518 - How Many Calls?(矩阵快速幂)
2015-07-20 17:48:01 来源: 作者: 【 】 浏览:2
Tags:UVA10518 How Many Calls 矩阵 快速

题目链接


题意:求第n个斐波那契数的递归次数MOD b

思路:用矩阵快速幂求斐波那契数列,然后打表找出递归次数的规律为f(n) = 2 * F(n) - 1(F(n)为斐波那契数)。

代码:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        typedef long long ll; using namespace std; ll n, b; struct mat{ ll s[2][2]; mat(ll a = 0, ll b = 0, ll c = 0, ll d = 0) { s[0][0] = a; s[0][1] = b; s[1][0] = c; s[1][1] = d; } }c(1, 1, 1, 0), tmp(1, 0, 0, 1); mat operator * (const mat& p, const mat& q) { mat state; for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) state.s[i][j] = (p.s[i][0] * q.s[0][j] + p.s[i][1] * q.s[1][j]) % b; return state; } mat pow_mod(ll k) { if (k == 0) return tmp; else if (k == 1) return c; mat a = pow_mod(k / 2); a = a * a; if (k % 2) a = a * c; return a; } int main() { int t = 1; while (scanf("%lld %lld", &n, &b) && (n || b)) { mat temp = pow_mod(n); ll ans = temp.s[0][0]; printf("Case %d: %lld %lld %lld\n", t++, n, b, (2 * ans - 1 + b) % b); } return 0; }
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇uva 11732 - strcmp() Anyone?(字.. 下一篇Codeforces 156B. Suspects

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python中文网 - 人生 (2025-12-24 18:49:47)
·【整整648集】这绝对 (2025-12-24 18:49:44)
·Python超详细一条龙 (2025-12-24 18:49:42)
·【超详细】JDK 下载 (2025-12-24 18:19:32)
·Java_百度百科 (2025-12-24 18:19:29)