文章目錄
1. 題目描述
1.1. Limit
Time Limit: 1000 ms
Memory Limit: 262144 kB
1.2. Problem Description
阿炳是一個精通文理的小機靈鬼,它是一個解鎖專家,也是一個詩人。一天,阿炳受邀前往黃臺甫馬哈那坤棄他哇勞狄希阿由他亞馬哈底陸浦歐叻辣塔尼布黎隆烏冬帕拉查尼衛馬哈灑坦,也就是今天俗稱的曼谷,解一個被文字鎖鎖住的寶箱。
文字鎖是這樣描述的,對於給定的一個,問存在多少正整數x滿足:
- ;
- 二進制位的位數不超過 ,例如 ,它的二進制位的位數就是;
- 的二進制形式,不存在連續的兩個二進制位上的數都是 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
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);
}
}
聯繫郵箱:[email protected]
Github:https://github.com/CurrenWong
歡迎轉載/Star/Fork,有問題歡迎通過郵箱交流。