斐波那契数列--计算前后缀
来源:互联网 发布:淘宝美工班 编辑:程序博客网 时间:2024/05/29 10:44
hdu3117
求[0,1e8]的F(n)的前后4位。
输入:
3536373839406465输出:
9227465149303522415781739088169632459861023...41551061...77231716...7565
1.斐波那契数列前4位的计算
通项公式 f[n]=(1/sqrt(5)) * { [(1 + sqrt(5)) / 2] ^ n - [(1 - sqrt(5)) / 2]^ n }
减号后面的部分,底数小于1,当n增大时,非常小,可以忽略。
F(n),对10取对数,得double lg = -0.5 * log10(5.0) + n * log10(gold);
直接再对10取幂貌似超时。
因为10对0.b次方等于10对a.b次方向右移a位,数字不变,所以可以
lg -= (int)lg;
double fn =pow(10,lg);
2.斐波那契数列对mod取余的计算
f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)(n>=3)
用矩阵表示为:
可用矩阵快速幂取模求解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespacestd;
const int maxn =40;
const double gold = (1 +sqrt(5.0)) /2;
long long f[maxn] = {0,1};
struct martrix{
int a[2][2] = {{1,0},{0,1}};
};
martrix multiply(martrix &a,martrix &b,int n)
{
martrix res;
memset(res.a,0,sizeof(res.a));
for (int i =0; i < n; i ++) {
for (int j =0; j < n; j ++) {
for (int k =0; k < n; k ++) {
res.a[i][j] += a.a[i][k] * b.a[k][j];
}
res.a[i][j] %=10000;
}
}
return res;
}
void prefix(int n)
{
double lg = -0.5 *log10(5.0) + n *log10(gold);
lg -= (int)lg;
double fn =pow(10,lg);
while(fn <1000) fn *= 10;
printf("%d...",(int)fn);
}
void suffix(int k)
{
martrix res,q;
q.a[0][1] =1;q.a[1][0] =1;q.a[1][1] =0;
while(k)
{
if (k &1) {
res = multiply(res, q,2);
}
k >>= 1;
q = multiply(q, q,2);
}
int fn = res.a[0][0] + res.a[0][1];
printf("%04d\n",fn %10000);
}
int main()
{
for(int i =2;i < maxn;i ++)f[i] = f[i -1] + f[i -2];
int n;
while(scanf("%d",&n) !=EOF)
{
if (n <maxn) {
printf("%lld\n",f[n]);
}
else {
prefix(n);
suffix(n -2);
}
}
return0;
}
- 斐波那契数列--计算前后缀
- ACdreamOJ 1116 斐波那契数列+hash计算后缀
- 斐波那契数列数列计算
- 函数递归计算斐波那契数列前40项和
- Java计算斐波那契数列
- 1042: 计算斐波那契数列
- 计算斐波那契数列
- 斐波那契数列的计算
- 斐波那契数列的计算
- Python计算斐波那契数列
- 计算斐波那契数列
- 斐波那契数列计算
- 计算斐波那契数列
- 计算斐波那契数列
- Python计算斐波那契数列
- 输出斐波那契数列前40项
- 斐波那契数列前20项
- 斐波那契数列 递归输出前n项
- docker service tasks “new” states
- lingo入门教程之三 --- 文件数据处理
- ESP8266--学习笔记(零)学习ESP8266常用软件
- google账号注册(解决收不到验证码的问题)
- 搭建nginx+php-fpm+php服务遇到的问题
- 斐波那契数列--计算前后缀
- cat /proc/pid/statm
- c 迷惑1
- 【树状数组】poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- Web Services基础知识
- 5-28 猴子选大王 (20分)
- PAT甲1020
- Kaggle : Using a Convolutional Neural Network for classifying Cats vs Dogs
- proxmox异常关机后的操作