description
zyf總是有很多奇異的想法,他最近常常幻想著以後能開這麼乙個工廠,可以把前三天裡生產出來的東西拿到今天來拼在一起作為今天生產的東西。假如前三天生產出來的產品數分別是x,y,z,那麼今天就能生產出x+y+z個。這樣一來只要前三天的投入,接下來的工廠每一天都是0成本運作,但產品數卻在極速增加,相當暴利。
當然,為了防止地球被破壞,為了維護世界的和平,zyf是不會讓工廠每天生產出來的東西超過1000000006個的,如果超過了,就不停減去1000000007,減到不超過為止。
現在zyf想知道如果第
一、二、三天分別生產a,b,c個產品的話,第n天會生產出多少產品呢?
input
輸入資料的第一行case數。
接下來每一行都有四個數字a,b,c,n(1<=a,b,c,n<=10^9),意義如上文.
output
對於每個case輸出一行,第n天生產的產品數。
sample input2
1 2 3 4
1 1 1 5
sample output6
5
#include #include #include#define div 1000000007
/*a=
0 0 1
1 0 1
0 1 1
*/// (a[n],a[n+1],a[n+2])*a=(a[n+1],a[n+2],a[n+3])
//然後求a的n 次方
void multiply(long long a[4],long long b[4]) //兩個矩陣相乘
; int i ,j,k;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
c[i][j]+=(a[i][k]%div)*(b[k][j]%div);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i][j]=c[i][j]%div;
}void power(long long a[4],int n) //乙個矩陣的n次方
else //n為偶數 a^n=a^(n-1)/2*a^(n-1)/2
}}int main()
; int n;
long long ans;
int i ,j;
int p=0,t;
long long matrix1[4][4]=,,};
long long matrix[4][4]=;
scanf("%d",&t);
while(p++!=t)
scanf("%d",&n);
if(n<4) //n<4則直接輸出前三個的 乙個
else
printf("%lld\n",ans%div);
} return 0;
}
我這個寫的是3個的,2個的更簡單點的 斐波那契數列時間複雜度
1.時間複雜度 o 2 n 空間複雜度 o n def fib n if n 3 return 1return f n 1 f n 2 推導 時間複雜度 f n f n 1 f n 2 每一層都包含乙個加法操作 例如n 8時,t n 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 1...
關於斐波那契數列
斐波那契數列是一種非常有意思的數列,由 00 0 和 11 1 開始,之後的斐波那契係數就由之前的兩數相加。用數學公式定義斐波那契數列則可以看成如下形式 f0 0f 0 0f0 0f1 1f 1 1f1 1fn fn 1 fn 2f n f f fn fn 1 fn 2 我們約定 fnf nfn 表...
斐波那契數與時間複雜度
斐波那契數列 經典數學問題之一 斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 第一項,第二項的值為1,第三項開始,它的值為前兩項之和。實現非常簡單 簡單的看看這個圖,分析一下,根據fab 1 n 1 fab 1 n 2 如果想要得到斐波那契其數的第五項,首先要...