Sicily 1214 訊號分析

2021-06-27 11:13:48 字數 2515 閱讀 1800

題目鏈結在此

(1)數列找規律。就是把序號寫成二進位制(無前導0),再倒過來就能得到對應的值。

1(1) = 1; 2(10) = 1;  3(11) = 3;  4(100) = 1 

5(101)=5; 6(110)= 3;  7(111)= 7;  8(1000)= 1; 

(2)題目要你求的就是在某數之前,其二進位制恰好為回文串的數的總數。例如5的二進位制是101,是回文串,所以a5=5符合條件。

(3)本題一共10個test case。覺得遍歷然後判斷是否為回文串的方法會超時,所以用構造回文串的方法解決。進一步找規律可以發現:

不包括0在內,

二進位制為1位的,共2^0=1個回文串,即1;

二進位制為2位的,共2^0=1個回文串,即11;

二進位制為3位的,共2^1=2個回文串,即101和111;

二進位制為4位的,共2^1=2個回文串,即1001和1111;

二進位制為5位的,共2^2=4個回文串,即10001,10101,11011,11111;

二進位制為6位的,共

2^2=4

個回文串,即100001,101101,110011,111111;……

二進位制為n位的,共2^[(n+1)/2-1]個回文串。

(4)以下以十進位制數48為例找出答案:

48的二進位制是110000;

他的二進位制有6位,是【偶數】個,後文還會介紹奇數字情況的數。

在48之前的二進位制為1-5位且為回文串的數共1+1+2+2+4=10個

再看在他之前的二進位制為6位的數。看最高的(6/2=3)位:110。比110小且以1開頭的二進位制數有

100,101這2個。這四個可以直接」對稱「到右邊形成回文串100001,101101。比110小這「2」個是怎麼數出來的來的呢?110有3位,除去前面的1,得到10,即為十進位制的2,也就是說比110小的有2個。這樣一來,目前就有10+2=12個符合要求的回文串。

最後再看110000本身,他的前(6/2=3)位:110,本身能否構造乙個符合要求的回文串呢?如果能,就是110011,發現他比110000要大,所以不行。怎麼判斷的呢?看他左半邊110的倒置011是否小於或等於右半邊000即可。

於是一共有12個符合要求的回文串。搞定。

(5)以下以十進位制數100為例找出答案:

100的二進位制是1100100;

他的二進位制有7位,是【奇數】個。

在100之前的二進位制為1-6位且為回文串的數共1+1+2+2+4+4=14個

再看在他之前的二進位制為7位的數。看最高的(7/2+1=4)位:1100。比1100小且以1開頭的二進位制數有

1000,1001,1010,1011這4個。這四個可以以最末位為軸」對稱「到右邊形成回文串1000001,1001001,1010101,1011101。比1100小這「4」個是怎麼數出來的來的呢?1100有4位,除去前面的1,得到100,即為十進位制的4,也就是說比1100小的有4個。這樣一來,目前就有14+4=18個符合要求的回文串。

最後再看1100100本身,他最高的前(7/2+1=4)位:1100,本身能否構造乙個符合要求的回文串呢?如果能,就是1100011,發現他比1100100要小,所以可以。怎麼判斷的呢?看他左半邊110的倒置011是否小於等於右半邊100即可。

於是一共有18+1=19個符合要求的回文串。搞定。

(6)最後注意資料規模問題,要用long long型。

以下**就是以上述過程為思路寫的,具體就不寫什麼注釋了。寫了一晚上一早上,最後ac了還是很有成就感的。

#include#include#pragma warning(disable:4996)  //  遮蔽vs對scanf報錯

using namespace std;

int main()

for (int i = 1; i < digit;i++)

int half = digit / 2;

long long highhalf = limit / (long long)pow(2.0, half);

if (digit % 2 == 0)

palindromenum += highhalf - (long long)pow(2.0, half - 1);

else if (digit % 2 == 1)

palindromenum += highhalf - (long long)pow(2.0, half);

int bits[64];

int count = 0;

while (limit != 0)

bool isgteq = true; // 是否大於或等於

for (int i = half-1; i >=0; i--)

else if (bits[i] < bits[digit - 1 - i])

} if (isgteq)

palindromenum += 1;

printf("%lld\n",palindromenum);

return 0;

}

Sicily1000 詞法分析

input 輸入一程式,結束符用 output 輸出單詞數對 類號,序號 輸出識別符號表,用空格分隔 輸出無符號整數表,用空格分隔 輸入樣例 main 輸出樣例 1,1 3,0 3,1 3,2 1,0 4,0 2,2 5,0 3,4 4,1 2,2 5,1 3,5 1,2 5,0 2,1 4,1 2...

Sicily 1000 詞法分析程式設計

description input 輸入一程式,結束符用 output 輸出單詞數對 類號,序號 輸出識別符號表,用空格分隔 輸出無符號整數表,用空格分隔 sample input main sample output 1,1 3,0 3,1 3,2 1,0 4,0 2,2 5,0 3,4 4,1 ...

USRP IQ訊號分析

原理向 i q訊號解調分析過程 高效的iq資料分析和輸出功能 iq訊號緣起緣滅 通訊訊號處理的一些基本常識 實用項 用python做科學計算 頻域訊號處理 python 繪圖,我只用 matplotlib matplotlib的spectral繪圖 基於python的快速傅利葉變換fft 基於pyt...