Skip to content

牛客网 NC200607 A-解锁专家#

目录#

1. 题目描述#

1.1. Limit#

Time Limit: 1000 ms

Memory Limit: 262144 kB

1.2. Problem Description#

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

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

  1. 二进制位的位数不超过 ,例如 ,它的二进制位的位数就是
  2. 的二进制形式,不存在连续的两个二进制位上的数都是 1。例如 ,则不满足条件,但是 则满足条件。

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


1.3. Input#

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

每组数据一行,一个数


1.4. Output#

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


1.5. Sample Input#

1
3

1.6. Sample Output#

1
4

1.7. Notes#

时,只有 满足条件。

时,有 共4种情况。

1.8. Source#

牛客网 NC200607 A-解锁专家


2. 解读#

将前几个数字列出来,和斐波那契数列一对比,会发现这就是斐波那契数列的变形。递推方程为,初始条件为

二进制数位 结果 斐波那契
1 1 1
2 2 1
3 4 3
4 7 5
5 12 8
6 20 13
7 33 21
8 54 34

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,有问题欢迎通过邮箱交流。

Back to top