蓝桥杯练习-入门训练-Fibonacci数列
2018-03-27 12:04
465 查看
蓝桥杯练习-入门训练-Fibonacci数列
时间限制:1.0s 内存限制:256.0MB问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
说明:
在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。
解题思路
斐波那契数列, 方法一:没什么好说的,暴力模拟
AC代码
#include<iostream> #include<string> #define ll long long int const int mod = 10007; using namespace std; int main() { ll n; while (cin >> n) { ll a = 1, b = 1; ll a1 = 1, b1 = 1; for (int i = 3; i <= n; ++i) { a1 = b % mod; b1 = (a + b)%mod; a = a1; b = b1; } cout << b << endl; } return 0; }
方法二:矩阵快速幂
构造矩阵表达式∣∣∣a11a21a12a22∣∣∣∗∣∣∣fn−1fn−2∣∣∣=∣∣∣fnfn−1∣∣∣|a11a12a21a22|∗|fn−1fn−2|=|fnfn−1|
易知,
∣∣∣1110∣∣∣∗∣∣∣fn−1fn−2∣∣∣=∣∣∣fnfn−1∣∣∣|1110|∗|fn−1fn−2|=|fnfn−1|
所以
∣∣∣1110∣∣∣n−2∗∣∣∣f2f1∣∣∣=∣∣∣fnfn−1∣∣∣|1110|n−2∗|f2f1|=|fnfn−1|
AC代码
#include<iostream> using namespace std; const int mod = 10007; struct matrix { //矩阵 int m[2][2]; }ans; matrix base = { 1, 1, 1, 0 }; matrix multi(matrix a, matrix b) { //矩阵相乘,返回一个矩阵 matrix tmp; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { tmp.m[i][j] = 0; for (int k = 0; k < 2; k++) tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % mod; } } return tmp; } int matrix_pow(matrix a, int n) { //矩阵快速幂,矩阵a的n次幂 ans.m[0][0] = ans.m[1][1] = 1; //初始化为单位矩阵 ans.m[0][1] = ans.m[1][0] = 0; while (n) { if (n & 1) ans = multi(ans, a); a = multi(a, a); n >>= 1; } return ans.m[0][1]; } int main() { int n; while (cin>>n) { cout << matrix_pow(base, n) << endl; } return 0; }
对比一下两个的效率
上面一个是矩阵快速幂
下面一个是暴力的
差别显而易见
相关文章推荐
- 蓝桥杯练习系统BEGIN-4 入门训练 Fibonacci数列
- 蓝桥杯练习----入门训练 Fibonacci数列
- 蓝桥杯练习:入门训练 Fibonacci数列
- 蓝桥杯练习:入门训练 Fibonacci数列
- 【蓝桥杯练习系统】 入门训练 Fibonacci数列
- 蓝桥杯练习系统入门训练
- 蓝桥杯练习系统之入门训练
- 蓝桥杯 入门训练 Fibonacci数列
- 蓝桥杯【入门训练】 Fibonacci数列
- 蓝桥杯:入门训练 Fibonacci数列
- 蓝桥杯练习-入门训练-序列求和
- 蓝桥杯 入门训练 Fibonacci数列
- 蓝桥杯练习之入门训练
- 蓝桥杯 入门训练 Fibonacci数列
- 蓝桥杯- 入门训练 Fibonacci数列
- 蓝桥杯-入门训练 Fibonacci数列
- 蓝桥杯入门训练 Fibonacci数列
- 蓝桥杯【入门训练】 Fibonacci数列
- 蓝桥杯 入门训练 Fibonacci数列
- 蓝桥杯 入门训练 Fibonacci数列