COJ 0200 Fibonacci

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=200

试题描述:

地球人都知道Fibonicca数列:

1 1 2 3 5 8 -----

输入两个正整数L,R,输出Fibonicca数列第L项加到第R项的结果,因为答案可能很大,请输出答案的后7位(不保留前导零)。

输入:

第一行为两个正整数L,R.

输出:

输出答案的后7位(不保留前导零)

输入示例:

1 5

输出示例:

12

其他说明:

60%数据: 1<=L<=R<=1000000
100%数据: 1<=L<=R<=2^31-1
其中20%数据保证L=R

题解:前缀和思想:f(L,R)=f(1,R)-f(1,L),然后变成裸矩阵乘。

                                            [0 , 1 , 0]

[f(n-2),f(n-1),S(n-2)] * [1 , 1 , 1] = [f(n-1),f(n),S(n-1)]

                                            [0 , 0 , 1]

注意n=1,2特判。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 const int mod=10000000;
 8 struct Matrix{
 9     long long A[3][3];
10     Matrix(){memset(A,0,sizeof(A));}
11 };
12 void print(Matrix M){
13     for(int i=0;i<3;i++){
14         for(int j=0;j<3;j++) printf("%d ",M.A[i][j]);
15         puts("");
16     }puts("");return;
17 }
18 Matrix mul(Matrix a,Matrix b){
19     Matrix ans;
20     for(int i=0;i<3;i++)
21        for(int j=0;j<3;j++){
22            for(int k=0;k<3;k++) ans.A[i][j]+=a.A[i][k]*b.A[k][j];
23             ans.A[i][j]%=mod;
24         }
25     return ans;
26 }
27 Matrix pow(Matrix a,int n){
28     Matrix ans=a,tmp=a;n--;
29     while(n){
30         if(n&1) ans=mul(ans,tmp);
31         tmp=mul(tmp,tmp);
32         n>>=1;
33     } return ans;
34 }
35 inline int read(){
36     int x=0,sig=1;char ch=getchar();
37     while(!isdigit(ch)){if(ch==‘-‘) sig=-1;ch=getchar();}
38     while(isdigit(ch)) x=10*x+ch-‘0‘,ch=getchar();
39     return x*=sig;
40 }
41 inline void write(int x){
42     if(x==0){putchar(‘0‘);return;} if(x<0) putchar(‘-‘),x=-x;
43     int len=0,buf[15]; while(x) buf[len++]=x%10,x/=10;
44     for(int i=len-1;i>=0;i--) putchar(buf[i]+‘0‘);return;
45 }
46 int initn[3][3]={
47     {0,1,0},
48     {1,1,1},
49     {0,0,1}
50 };
51 int solve(int n){
52     if(n==0) return 0;
53     if(n==1) return 1;//真坑!
54     Matrix M;
55     for(int i=0;i<3;i++)
56         for(int j=0;j<3;j++)
57             M.A[i][j]=initn[i][j];
58
59     M=pow(M,n-1);
60     //puts("here!");print(M);
61     return (M.A[1][1]+M.A[1][2])%mod;
62 }
63
64 void init(){
65     return;
66 }
67 void work(){
68     int a=read(),b=read();
69     printf("%d\n",(solve(b)-solve(a-1)+mod)%mod);
70     return;
71 }
72 void print(){
73     return;
74 }
75 int main(){
76     init();work();print();return 0;
77 }
时间: 2024-12-15 13:01:23

COJ 0200 Fibonacci的相关文章

NYOJ 480 Fibonacci Again!

Fibonacci Again! 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 求第n个斐波那契数是否是一个素数,n为整数 f[n]=f[n-1]+f[n-2] (2<n<30) f[1]=3,f[2]=7 输入 输入整数m,0<m<30,输入-1表示结束输入 输出 假设f[m]是素数 则输出Yes,否则输出No, 每行输出占一行. 例子输入 2 3 例子输出 Yes No #include<stdio.h> int f[35]={0

HDU1848 Fibonacci again and again

Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8198    Accepted Submission(s): 3412 Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F(2)=2;

hdu 5167 Fibonacci(DFS)

hdu 5167 Fibonacci 问题描述 斐波那契数列的递归定义如下: Fi=???01Fi?1+Fi?2i = 0i = 1i > 1 现在我们需要判断一个数是否能表示为斐波那契数列中的数的乘积. 输入描述 有多组数据,第一行为数据组数T(T≤100,000). 对于每组数据有一个整数n,表示要判断的数字. 0≤n≤1,000,000,000 输出描述 对于每组数据,如果可以输出"Yes",否则输出"No". 输入样例 3 4 17 233 输出样例

HDU 4099 Revenge of Fibonacci

Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/Others) Total Submission(s): 2027    Accepted Submission(s): 475 Problem Description The well-known Fibonacci sequence is defined as following: Here w

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

HUDJ 1021 Fibonacci Again

Fibonacci Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 36028    Accepted Submission(s): 17385 Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n)

Fibonacci数

Fibonacci数 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为F(n)=1 ...........(n=1或n=2)F(n)=F(n-1)+F(n-2).....(n>2)现要你来求第n个斐波纳奇数.(第1个.第二个都为1) 输入 第一行是一个整数m(m<5)表示共有m组测试数据每次测试数据只有一行,且只有一个整形数n(n<20) 输出 对每组输入n,输出第n个Fibonacci数 实现: package July;

Python中的函数递归思想,以及对比迭代和递归解决Fibonacci数列

什么是递归?简单的说就是:函数自身调用自身. "普通程序员用迭代,天才程序员用递归" 虽然递归 在运行时会不断出栈压栈,调用底层的寄存器,造成空间上的占用以及时间上的缓慢, 但在一些算法上面仍然是递归很实用 但需要注意的是: #递归是自己调用自己 很消耗时间,还会有消耗空间的危险,所以递归递归一定要知道"归去来兮" #所谓"归去来兮"就是指递归的两个原则: #1.调用了函数自身 #2.设置了自身正确的返回值 (必须有一个正确的返回停止条件,不能无

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,