蓝精灵之小饭写数字

蓝精灵之小饭写数字

题目:

蓝精灵之小饭写数字

题面:

有一个数列叫斐波那契数列,f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2),小饭有支大力金刚笔,能写n位数字,她想知道,如果从f(1)开始写,她能写到第几个斐波那契数。。比如n=20,那么她能写。11235813213455891442。。。第13个斐波那契数。如果n=1亿,问小饭能写到第几个斐波那契数?

输入描述:

输入数据有多组。
输入一个整数n(0<n<1e8)。

输出描述:

输出答案。

输入样例:

20

输出样例:

13

题解

先用公式预处理出1e8个数需要多少个斐波那契数组成,然后求前缀和,二分查找合适的答案

#include <cstdio>
#include <cmath>
typedef long long LL;
LL ans[31000];
int main() {
    LL cnt = 0;
    for(LL i = 1; cnt <= 100000000; i++) {
        LL result = (long long)((double)i * log10(0.5 + 0.5 * sqrt(5)) - log10(sqrt(5))) + 1;
        cnt += result;
        ans[i] = cnt;
    }
    LL sum, ans1, ans2;
    while(~scanf("%lld", &sum)) {
        LL l = 0, r = 30935, mid;
        while(r - l > 1) {
            mid = (l + r) / 2;
            if(ans[mid] <= sum && ans[mid + 1] >= sum) {
                if(ans[mid] == sum) mid--;
                break;
            }
            else if(ans[mid + 1] < sum) l = mid;
            else r = mid;
        }
        printf("%lld
", mid + 1);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/fanshhh/p/11377898.html