2014年蓝桥杯的第九题是这样描述的:

    给定Fibonacci数列F[],其中,求表达式


       

    

    的值。其中


在讲解这道题之前,我们先来看一个简单版的。题目如下:

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1194

分析:可以看出本题就是直接求,虽然这里的很大,但是比较小啊,只到1000,那么实际上

在Fibonacci数列中有很多有用的性质,比如:

实际上,这个两个公式的推导过程也比较简单。(两种证明方法:带入公式验证;数学归纳法)

所以,我们可以这样来把原表达式变形,即:

那么,我们继续对用同样的方法递归下去,容易得到:

可以看出,到了这一步,我们就把所有的Fibonacci数列的下标减小了,基本可以直接计算了。

因为,所以我们得到

所以到了这里,本题基本就说完了,只需要预处理前1000个Fibonacci数列即可。代码如下:

import java.io.*;
import java.util.*;
import java.math.BigInteger;public class Main {final static int N = 1005;static BigInteger F[] = new BigInteger[N];static void Init(){F[0] = BigInteger.ZERO;F[1] = BigInteger.ONE;for(int i=2;i<N;i++)F[i] = F[i-1].add(F[i-2]);}public static void main(String[] args){Init();Scanner cin = new Scanner(System.in);int T = cin.nextInt();while(T-- != 0){long n = cin.nextLong();int k = cin.nextInt();int x = (int)(n % k);long y = n / k;int sign = 1;if((k & 1) == 1)sign = -1;BigInteger ans = F[x];if(sign == 1){if((y & 1L) == 1L)ans = ans.multiply(F[k-1]);}else{if((y & 1L) == 1L)ans = ans.multiply(F[k-1]);y >>= 1;if((y & 1L) == 1L) ans = ans.multiply(F[k].subtract(BigInteger.ONE));}System.out.println(ans.mod(F[k]));}}
}

完美解出上题后,我们来看2014年蓝桥杯的C++ A组的第九题,题目描述在文章开始处。

可以看出本题的难点在于很大,所以导致也会很大,当然求和的那部分是很简单的。

因为,那么就有

所以我们可以把原问题简单模型化为求

经过上面简单版题目的介绍,我们知道

又知道

那么分为奇偶情况进行讨论:

一.为偶数时

很明显,这样我们再分为奇偶进行讨论

(1)如果为偶数,那么有

(2)如果为奇数,那么有

二.为奇数时

得到,再继续分的奇偶和的奇偶情况进行讨论

(1)如果为偶数且为偶数,那么

(2)如果为偶数且为奇数,那么

(3)如果为奇数且为偶数,那么

(4)如果为奇数且为奇数,那么

从上面的所有情况来看,难点就在于如何进一步简化

对于这个问题,我们还有另一个性质

性质:若,则

可以看出,再对比,可知

我们令,那么利用上述性质,我们替换一下:,得到:

,变换一下顺序,即

,所以

可以看出,所以再分的奇偶性进行讨论:

(1)为奇数时,

(2)为偶数时,

到了这里,我们就对进行了简化,那么再对取余用矩阵快速幂解决即可。

最后,来看一道类似的题目。描述如下


题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1365


代码:

#include <iostream>
#include <string.h>
#include <stdio.h>using namespace std;
typedef long long LL;
const int N = 2;
const int MOD = 1000000007;struct Matrix
{LL m[N][N];
};Matrix I = {1, 0,0, 1
};Matrix A = {1, 1,1, 0
};Matrix multi(Matrix A, Matrix B)
{Matrix C;for(int i = 0; i < N; i++){for(int j = 0; j < N; j++){C.m[i][j] = 0;for(int k = 0; k < N; k++)C.m[i][j] += A.m[i][k] * B.m[k][j];C.m[i][j] %= MOD;}}return C;
}Matrix Power(Matrix A, LL n)
{Matrix ans = I, P = A;while(n){if(n & 1){ans = multi(ans, P);n--;}n >>= 1;P = multi(P, P);}return ans;
}//计算F(n) % MOD
LL getFun(LL n)
{Matrix ans = Power(A, n);return ans.m[1][0];
}//计算F(m - 1) * F(n % m) mod F(m)
LL getRes(LL n, LL m)
{LL k = n % m;if(k & 1)return getFun(m - k);return ((getFun(m) - getFun(m - k)) % MOD + MOD) % MOD;
}LL Solve(LL n, LL m)
{LL t1 = n / m;if(m & 1){LL t2 = t1 >> 1;if(t1 % 2 == 0 && t2 % 2 == 0)return getFun(n % m);if(t1 % 2 == 0 && t2 % 2 == 1)return ((getFun(m) - getFun(n % m)) % MOD + MOD) % MOD;if(t1 % 2 == 1 && t2 % 2 == 0)return getRes(n, m);if(t1 % 2 == 1 && t2 % 2 == 1)return ((getFun(m) - getRes(n, m)) % MOD + MOD) % MOD;}else{if(t1 & 1)return getRes(n, m);elsereturn getFun(n % m);}
}LL getResponse(LL n, LL m)
{
//  n += 2;LL res = Solve(n, m);
//  if(res == 0)
//      return getFun(m) - 1;
//  return res - 1;return res;
}int main()
{int T;scanf("%d", &T);while(T--){LL n, k;scanf("%lld %lld", &n, &k);printf("%lld\n", getResponse(n, k));}return 0;
}


从蓝桥杯来谈Fibonacci数列相关推荐

  1. 蓝桥杯入门训练Fibonacci数列 C语言

    Fibonacci数列 C语言 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少 ...

  2. 【c语言】蓝桥杯入门训练 Fibonacci数列

    [问题描述] Fibonacci数列的递推公式为:Fn=F(n-1)+F(n-2),其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. [输入格式] 输 ...

  3. 蓝桥杯入门训练Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  4. 蓝桥杯 入门训练 Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  5. 蓝桥杯练习题之 Fibonacci数列

    入门训练 Fibonacci数列 时间限制:1.0s   内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非 ...

  6. 蓝桥杯 Python 练习题 Fibonacci数列

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除 ...

  7. 蓝桥杯基础练习 Fibonacci数列 C语言实现

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除 ...

  8. 蓝桥杯试题:Fibonacci数列

    原题为: 一开始用最笨拙的思路:先用递归算斐波那契数列的值,再取余.结果运算速度太慢,当数值大于10007时还出错. import java.util.*; public class Main {pu ...

  9. 蓝桥杯: 基础练习 数列排序

    蓝桥杯: 基础练习 数列排序  问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个 ...

最新文章

  1. 润乾报表JSF FORM 标签中使用填报表解决方案
  2. 利用oracle执行系统命令,利用oracle存储过程执行操作系统命令(转)
  3. Morphling:云原生部署 AI ,如何把降本做到极致?
  4. 600 imp oracle_oracle数据库的导入导出(imp和exp)
  5. 学习分布式不得不会的ACP理论
  6. 如何形象的解释javascript中map,foreach,reduce的区别
  7. 阿里云服务器如何更换系统镜像
  8. 为Node.js编写组件的几种方式
  9. Mybatis插件机制原理
  10. 百度 AI Studio 车牌识别
  11. 关于跨境电商shopee平台,你了解多少?
  12. 12-14日小米4 手机不停的无限重启。用下面方法及清理电源,音量按钮恢复
  13. vim ctrl + s 终端假死?
  14. 覃超:Facebook的项目开发流程和工程师的绩效管理机制
  15. 有机能量棒行业调研报告 - 市场现状分析与发展前景预测
  16. Java中%是什么意思?
  17. 用Python并行处理大文件,看这篇就够了!
  18. 基于Django的web开发(一)
  19. python 文件格式转换器_python文件格式转换
  20. 计算机基础的建议,计算机应用基础教学实施建议.docx

热门文章

  1. Spring Bean 作用域之间的区别?
  2. Nacos注册中心介绍
  3. Map+Model+ModelMap介绍
  4. 角色操作-查询所有角色代码实现
  5. 发布订阅之topics
  6. plsql编程语言定义变量
  7. 微服务和其他常见架构
  8. SpringCloud导学
  9. SpringBoot_日志-SpringBoot日志关系
  10. php socket 效率,php socket 模型及效率问题