蓝精灵之小饭写数字
题目:
蓝精灵之小饭写数字
题面:
有一个数列叫斐波那契数列,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;
}