UVA12470—Tribonacci (类似斐波那契,简单题)

题目链接:https://vjudge.net/problem/UVA-12470

题目意思:我们都知道斐波那契数列F[i]=F[i-1]+F[i-2],现在我们要算这样的一个式子T[i]=T[i-1]+T[i-2]+T[i-3]的第n想是多少,很套路的矩阵快速幂,入门题,算是熟悉矩阵快速幂的操作吧。

代码:

 1 //Author: xiaowuga
 2 #include<bits/stdc++.h>
 3 #define maxx INT_MAX
 4 #define minn INT_MIN
 5 #define inf 0x3f3f3f3f
 6 #define N  3
 7 using namespace std;
 8 const int MOD=1000000009;
 9 typedef long long ll;
10 ll  n,size=3;//第n项,矩阵大小
11 struct Matrix{
12     ll mat[N][N];
13     void clear(){
14         memset(mat,0,sizeof(mat));
15     }
16     Matrix operator * (const Matrix & m) const{
17         Matrix tmp;
18         int i ,j,k;
19         tmp.clear();
20         for( i=0;i<size;i++)
21             for( k=0;k<size;k++){
22                 if(mat[i][k]==0) continue;
23                 for( j=0;j<size;j++){
24                     tmp.mat[i][j]+=mat[i][k]*m.mat[k][j];
25                     tmp.mat[i][j]%=MOD;
26                 }
27             }
28         return tmp;
29     }
30 };
31 Matrix POW(Matrix m,ll k){
32     Matrix ans;
33     memset(ans.mat,0,sizeof(ans.mat));
34     for(int i=0;i<size;i++) ans.mat[i][i]=1;
35     while(k){
36         if(k&1) ans=ans*m;
37         k=k>>1;
38         m=m*m;
39     }
40     return ans;
41 }
42 int main() {
43     Matrix m;
44     m.clear();
45     m.mat[0][0]=m.mat[0][1]=m.mat[0][2]=1;
46     m.mat[1][0]=1;m.mat[2][1]=1;
47     ll f[3]={2,1,0};
48     while(cin>>n&&n){
49         if(n<=3) {cout<<n-1<<endl; continue;}
50         Matrix ans=POW(m,n-3);
51         ll sum=0;
52         for(int i=0;i<3;i++){
53            sum+=ans.mat[0][i]*f[i]%MOD;
54            sum%=MOD;
55         }
56         cout<<sum<<endl;
57     }
58     return 0;
59 }

时间: 2024-10-14 14:11:52

UVA12470—Tribonacci (类似斐波那契,简单题)的相关文章

CF 633D【斐波那契】

狂WA巨坑题 题意:给出n<=1000个数,能组成的类似斐波那契的数列最长长度是多少(fn=fn-1+fn-2,n>=2) solution:看起来是一道相当高端的数论题,还是D题?我现在都没现场切过D 没想到做法就是暴力?不过暴力可证复杂度OK 感觉枚举一下前两项,一直往下找,这样用个map维护一下复杂度也是n^3logn啊 不过打个斐波那契数列的表就能发现,因为每个值范围[-1e9,1e9],所以即使数列第一个和第二个是绝对值很小的两个1也会在45项左右停止,这样的话就算50项,复杂度好像

“斐波那契数列”衍生题

一.斐波那契数列 斐波那契数列是这样的一组数列:1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)即大于2的部分是由前两个相加获得. 若要求第 N 个数的值,我们可以用递归也可以通过迭代的方式求解 1.递归 def fibonacci(n): if n == 1 or n == 2: return 1 return fibonacci(n - 1) + fibona

(hdu step 2.2.1)Fibonacci(求当n很大时的斐波那契数)

题目: Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3036 Accepted Submission(s): 1397   Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] =

斐波那契数列的实现(简单递归和动态规划)

斐波那契数列的实现(简单递归和动态规划) 一.简单递归的实现 1 #include "stdafx.h" 2 #include <string> 3 using namespace std; 4 int f(int n) 5 { 6 if (n == 0) 7 { 8 return 0; 9 } 10 if (n == 1) 11 { 12 return 1; 13 } 14 return f(n - 1) + f(n - 2); 15 } 16 int _tmain(in

第3题:判断质数&amp;第4题:简单斐波那契

第3题:判断质数 对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数.晓萌想判断一个数是不是质数,希望找你写个程序,帮助她进行判断. 输入包括一行,为一个整数N(1 < N ≤1000),正是晓萌给出你让你判断的数字.<n≤1000).< style="box-sizing: border-box;"> 输出包括一行,如果晓萌给出的整数N为质数,那么输出YES:如果N不是质数,那么输出NO. 样例输入 3 样例输出 YES 答案

简单东西-斐波那契函数实现

CSDN首页的极客头条里看到一个问题,实现斐波那契函数,并且计算n等于100时的函数值.简单地想了下,所能想到的就是使用递归完成.用递归实现,测试发现递归效率非常低,尤其是当计算的N稍微大点时,计算N=100差不多耗费了3000秒.而且需要考虑长度问题,返回值不能用int,溢出的临界是N=50. 无意中逛CSDN的问答频道,恰好也看到一个斐波那契函数的问题,而且不是用递归而是用临时中间变量存储每次计算得到的中间值,测试发现这比递归快多了,计算N=100,瞬间出结果. 三种实现方法如下: publ

java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)

为什么说 “算法是程序的灵魂这句话一点也不为过”,请看下面这个简单的案例 1 package recursion; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import org.junit.Test; 7 8 /** 9 * @author: MengXianman 10 * @creationTime: 2017年11月27日 上午9:47:51 11 * @description: 斐波那契数列结合备忘录算法的简单使

简单斐波那契——计蒜客(4)

题目来自“计蒜客”第4题. 解算法题之前,务必先写出与之对应的数学表达式,用于描述算法. 数学描述如图: 根据“数学描述“,写出代码如下: #include <stdio.h> int main() { int N =0 ; scanf("%d", &N); int i, fn1 = 1, fn2 = 0, fn; switch(N) { case 0: printf("0"); break; case 1: printf("1&quo

求:简单又困难的 “斐波那契数列”代码

下面给出上篇博客的代码解释具体的我也在注释里面写清楚了. 至于矩阵构造嘛..还是要看个人悟性(也有运气),显然这个我还是不行的,这个矩阵初始化我复制的. 1 #include <cstdio> 2 #include <cstring> 3 const int M = 1E9 + 7; 4 struct Matrix { 5 long long a[2][2]; 6 Matrix() { memset(a, 0, sizeof(a)); } //构造矩阵 7 //定义矩阵乘法 8 M