NYOJ 148
fibonacci数列(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
An alternative formula for the Fibonacci sequence is
.
Given an integer n, your goal is to compute the last 4 digits of Fn.
Hint
As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by
.
Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:
.
- 输入
- The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.
- 输出
- For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).
- 样例输入
-
0 9 1000000000 -1
- 样例输出
-
0 34 6875
1 //找周期 2 #include <stdio.h> 3 4 #define N 20000 5 int a[N]={0,1}; 6 7 int init() 8 { 9 int i,j,k; 10 for(i=2;i<N;i++) 11 { 12 a[i]=(a[i-1]+a[i-2])%10000; 13 if(a[i]==0) 14 { 15 a[i+1]=(a[i]+a[i-1])%10000; 16 if(a[i+1]==1) 17 break; 18 } 19 } 20 return i; 21 } 22 23 int main() 24 { 25 int i,j,k; 26 int n; 27 int period = init(); 28 while(scanf("%d",&n),n!=-1) 29 { 30 n%=period; 31 printf("%d\n",a[n]); 32 } 33 return 0; 34 }
1 //快速幂算法 2 #include<stdio.h> 3 4 void fast_pow(int a1[][2], int a2[][2]) 5 { 6 int c[2][2]; 7 int i, j, k; 8 for (i=0; i<2; ++i) 9 { 10 for (j=0; j<2; ++j) 11 { 12 c[i][j] = 0; 13 for (k=0; k<2; ++k) 14 { 15 c[i][j] = (c[i][j] + a1[i][k] * a2[k][j]) % 10000; 16 } 17 } 18 } 19 for (i=0; i<2; ++i) 20 { 21 for (j=0; j<2; ++j) 22 { 23 a1[i][j] = c[i][j]; 24 } 25 } 26 } 27 28 int main() 29 { 30 int i,j,k; 31 int n; 32 while (scanf("%d", &n) , n != -1) 33 { 34 int a[2][2] = {{1, 1}, {1, 0}}; 35 int b[2][2] = {{1, 0}, {0, 1}};//单位矩阵 36 while (n) 37 { 38 if (n & 1) 39 fast_pow(b, a); 40 fast_pow(a, a); 41 n >>= 1; 42 } 43 printf ("%d\n", b[1][0]);//最后n必然从1变为0,所以最后一次总要执行 fast_pow(b, a); 44 } 45 return 0; 46 }
HDU 1005
f(1) = 1, f(2) = 1, f(n) = (A * f(n – 1) + B * f(n – 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
同样是构造矩阵
1 #include<stdio.h> 2 int main() 3 { 4 int f[200],a,b,n,i; 5 while(scanf("%d%d%d",&a,&b,&n),a||b||n) 6 { 7 if(n>2) 8 { 9 f[1]=f[2]=1; 10 for(i=3;i<200;i++) 11 { 12 f[i]=(a*f[i-1]+b*f[i-2])%7; 13 if(f[i-1]==1&&f[i]==1) 14 break; 15 } 16 i-=2;//LPP,最小正周期 17 n=n%i;//比如1~5是个循环周期,f(6)=f(1)、 18 if(n==0) 19 printf("%d\n",f[i]); 20 else 21 printf("%d\n",f[n]); 22 } 23 else 24 printf("1\n"); 25 } 26 return 0; 27 }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.