題目描述
奶牛bessie最近在學習字串操作,它用如下的規則逐一的構造出新的字串:
s(0) = 「moo」
s(1) = s(0) + 「m」+ 「ooo」 + s(0) = 「moo」 + 「m」 + 「ooo」 + 「moo」 = 「moomooomoo」
s(2) = s(1) + 「m」 + 「oooo」 + s(1) = 「moomooomoo」 + 「m」 + 「oooo」 + 「moomooomoo」 = 「moomooomoomoooomoomooomoo」
bessie就這樣產生字串,直到最後產生的那個字串長度不小於讀入的整數n才停止。
通過上面觀察,可以發現第k個字串是由:第k-1個字串 + 「m」 + (k+2個o) + 第k-1個字串連線起來的。
現在的問題是:給出乙個整數n (1 <= n <= 10^9),問第n個字元是字母『m』還是『o』?
輸入格式
乙個整數n。
輸出格式
乙個字元,m或者o
輸入 #1
輸出 #1m第 i 個字串的長度為 a[i]=2*a[i-1]+i+3; 先預處理出長度為 n 的字串是第幾個字串;也就是說要連線幾次;
解法一:
根據要連線幾次,然後把字串連線起來,求n的位置的字元;
但是只有80分,因為n的範圍為1e9;爆了空間;
#include
using
namespace std;
int n;
int a[
100000];
string dfs
(int p)
string ss="";
for(
int i=
1;i<=p+
2;i++
) ss+
="o"
; string b=
dfs(p-1)
;return b+
"m"+ss+b;
}int
main()
} string s=
dfs(ans)
; cout<
}
解法二:
看**模擬一下,應該就可以了吧;
#include
#define ll long long
#define pa pair
#define lson k<<1
#define rson k<<1|1
#define n 500100
#define m 2000010
using
namespace std;
int n;
int a[
100000];
void
dfs(
int p,
int q)
else
if(p<=a[q-1]
+q+3
)dfs
(p-a[q-1]
-q-3
,q-1);
}int
main()
}dfs
(n,ans)
;return0;
}
洛谷P1157 組合的輸出 DFS暴力
題目鏈結 這個題目和全排列有一些不一樣 該題需要先從1 n中選擇m個數字,然後再對m個數字公升序排列。前半句,從n個數字選m個,普通的全排列可以做到,對m個數字公升序排列,那麼就在每一次選擇數字的時候從上次最後乙個出發就可以。主要也是我審題不清晰。include include include in...
洛谷P1161 開燈(暴力)
在一條無限長的路上,有一排無限長的路燈,編號為1,2,3,4,1,2,3,4,1,2,3,4,每一盞燈只有兩種可能的狀態,開或者關。如果按一下某一盞燈的開關,那麼這盞燈的狀態將發生改變。如果原來是開,將變成關。如果原來是關,將變成開。在剛開始的時候,所有的燈都是關的。小明每次可以進行如下的操作 指定...
洛谷 P1019 單詞接龍 模擬,dfs深搜
分析ac code 題目傳送門 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast和astonishastonish,如果接成...