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.

 

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 }

 

 

 

 

 

 

目录
相关文章
|
7月前
|
算法
NYOJ-448-寻找最大数
NYOJ-448-寻找最大数
32 0
|
人工智能 算法
|
测试技术
NYOJ 541
  最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。
775 0
|
人工智能 测试技术
NYOJ&#160;79
拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意 的高度,但是以后每一发炮弹都不能高于等于前一发的高度。
962 0
|
JavaScript
NYOJ&#160;17
时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 题目很经典,学习一下吧。
673 0
|
测试技术
NYOJ 523
  亡命逃窜 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述   从前有个叫hck的骑士,为了救我们美丽的公主,潜入魔王的老巢,够英雄吧。不过英雄不是这么好当的。
918 0
|
人工智能
NYOJ 461
  Fibonacci数列(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述 数学神童小明终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
726 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
682 0
NYOJ 86
  找球号(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0
812 0