暫無鏈接
玩串
【問題描述】
艾奇非常喜歡玩串。
艾奇覺得,字符串什麼的非常優美。她會有事沒事地給一個字符串數它有多
少個好的非空子序列。
一個好的子序列,滿足它是的形式。
比如說,就是好的,而就不是好的。
衆所周知,一個字符串的子序列有的長度次方個,而好的字符串長度一定是偶數。
而一個字符串的權值,就是本質不同的好的子序列的個數。
兩個子序列本質不同,當且僅當它們之中任意一個字符所處的位置不同。
(以上大家應該都知道吧)
一天,艾奇數着數累了,她想知道對於一個權值,你能否找到這樣一個字符串呢?
當然,本題可能有多個滿足條件的解,你只需要輸出任何一個即可。
當然我不可能讓你隨意輸出對吧,不然這題還做個球。
任何情況下,字符串的長度不能超過,字符集大小不能超過。
就這麼簡單。
【輸入格式】
輸入文件名爲。
一行一個整數,表示你輸出的串需要包含的權值。
【輸出格式】
輸出文件名爲。
第一行一個數,表示你輸出字符串的長度。
第二行個數,表示你輸出的滿足要求的串。
【輸入樣例 1】
詳見
【輸出樣例 1】
詳見
【數據範圍】
【備註】
下發的樣例輸出文件,只是供作參考,表示一種合法的字符串。
字符串的輸出形式,你需要輸出一行不超過個數。每個數的大小不超過 。每個
數表示一個對應的字符。不同的數字代表不同的字符。
題解
我們考慮上空串,先讓,答案初始爲空,價值爲,設整個串由兩部分構成,其中爲,我們可以由下面兩個操作更改整個串的價值:
價值加一:;
價值乘二:。
然後就做完了。。。
代碼
#include<bits/stdc++.h>
using namespace std;
deque<int>dui;
int n,tot,bit[30],top,i;
void in(){scanf("%d",&n);}
void ac()
{
for(++n;n;n>>=1)bit[++top]=n&1;
for(dui.push_front(++tot),i=top-1;i;--i,dui.push_back(++tot))if(bit[i]&1)dui.push_front(++tot);
printf("%d\n",tot-1<<1);for(i=1;i<tot;++i)printf("%d ",i);for(;dui.size()>1;dui.pop_front())printf("%d ",dui.front());
}
int main(){in(),ac();}