牛客网 NC200607 A-解锁专家 斐波那契数列

1. 题目描述

1.1. Limit

Time Limit: 1000 ms

Memory Limit: 262144 kB

1.2. Problem Description

阿炳是一个精通文理的小机灵鬼,它是一个解锁专家,也是一个诗人。一天,阿炳受邀前往黄台甫马哈那坤弃他哇劳狄希阿由他亚马哈底陆浦欧叻辣塔尼布黎隆乌冬帕拉查尼卫马哈洒坦,也就是今天俗称的曼谷,解一个被文字锁锁住的宝箱。

文字锁是这样描述的,对于给定的一个 n n n,问存在多少正整数x满足:

  1. x > 0 x>0 x>0
  2. x x x 二进制位的位数不超过 n n n,例如 5 = 101 ( 2 ) 5=101(2) 5=101(2),它的二进制位的位数就是 3 3 3
  3. x x x 的二进制形式,不存在连续的两个二进制位上的数都是 1。例如 3 = 11 ( 2 ) 3=11(2) 3=11(2),则不满足条件,但是 5 = 101 ( 2 ) 5=101(2) 5=101(2) 则满足条件。

阿炳思考了5分钟后,望着山下的美景,不禁写起了诗:
飞花两岸照船红,
波光山色两盈盈。
那年私语小窗边,
妾心陌上悠扬蝶。
原来阿炳不会解,为了掩饰尴尬,只好作诗缓解一些尴尬的气氛,阿炳作为一个知名解锁专家,当然是要面子的嘛,所以,阿炳请你帮帮他解决这个问题。


1.3. Input

多测试数据样例,测试样例组数不超过10000。

每组数据一行,一个数 n ( 1 ≤ n ≤ 100 ) n(1 \le n \le 100) n1n100


1.4. Output

每组数据输出一个数,满足条件的正整数 x x x 的个数取模 433494437(即答案需要 %433494437)


1.5. Sample Input

1
3

1.6. Sample Output

1
4

1.7. Notes

n = 1 n=1 n=1时,只有 x = 1 x=1 x=1 满足条件。

n = 3 n=3 n=3时,有 x = 1 ( 001 ) , x = 2 ( 010 ) , x = 4 ( 100 ) , x = 5 ( 101 ) x=1(001), x=2(010), x=4(100), x=5(101) x=1(001),x=2(010),x=4(100),x=5(101) 共4种情况。

1.8. Source

牛客网 NC200607 A-解锁专家


2. 解读

将前几个数字列出来,和斐波那契数列一对比,会发现这就是斐波那契数列的变形。递推方程为 f ( n ) = f ( n − 1 ) + f ( n − 2 ) + 1 f(n) = f(n-1) + f(n-2) + 1 f(n)=f(n1)+f(n2)+1,初始条件为 f ( 0 ) = 0 f(0) = 0 f(0)=0 f ( 1 ) = 1 f(1) = 1 f(1)=1

Table 1. 样例数据分析 \text{Table 1. 样例数据分析} Table 1. 样例数据分析

n n n二进制数位结果斐波那契
1 ( 0 ) B (0)_B (0)B11
2 ( 00 ) B (00)_B (00)B21
3 ( 000 ) B (000)_B (000)B43
4 ( 0000 ) B (0000)_B (0000)B75
5 ( 00000 ) B (00000)_B (00000)B128
6 ( 000000 ) B (000000)_B (000000)B2013
7 ( 0000000 ) B (0000000)_B (0000000)B3321
8 ( 00000000 ) B (00000000)_B (00000000)B5434

3. 代码

#include<iostream>
#include<algorithm>
const long long num = 1e2 + 1;
using namespace std;

long long list[num];

// 通过递推方程进行计算
void calculate(int n){
    list[0] = 0;
    list[1] = 1;
    for(int i = 2; i <= n; i++){
        list[i] = (list[i-1] + list[i-2] + 1)% 433494437;
    }
}

int main(){
    long long n;
    long long ans = 0;
    calculate(num-1);
    // 输入
    while(scanf("%lld", &n) != EOF){
        ans = list[n];
        printf("%lld\n", ans);
    }
}

联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值