最不熟的兩個東西 2 k進製數

2022-03-21 06:55:49 字數 1116 閱讀 5299

【題目描述】

設r是個2^k 進製數,並滿足以下條件:

(1)r至少是個2位的2^k 進製數。

(2)作為2^k進製數,除最後一位外,r的每一位嚴格小於它右邊相鄰的那一位。

(3)將r轉換為2進製數q後,則q的總位數不超過w。

在這裡,正整數k(1≤k≤9)和w(k

【輸入格式】

輸入檔案只有1行,為兩個正整數,用乙個空格隔開:

k w【輸出格式】

【樣例輸入】

3 7【樣例輸出】

36【分析】

手最生的數論和高精度。

引用啞熊的熊洞

上的題解。

題目中的那個從另一角度分析就已經蘊含了這個題的基本思路。就以題目的例子為例,長度為7位的01字串按3位一段就這樣分:0 000 000。其中除了首段,每段都小於(111)2,也即小於2k,而首段自然是小於2w%k(對於w%k為0時也成立)了。

如果首段為0,則當這個2k進製數字數分別為2、3、...、[n/k]時,如果用b_max表示2k,對應的解的個數分別為c[b_max-1][2]、c[b_max-1][3]、...、c[b_max-1][n/k](c[i][j]表示從i個數里選j個構成一組組合)。

如果首段不為0,設首段為x,則解就有c[b_max-x-1][n/k]個。

這樣,求解的個數就搞定了,剩下的活就是高精了。求組合數可以用這個公式:c[n][m]=c[n-1][m-1]+c[n-1][m],這樣高精就只用加法了。

原文傳送門:

#include #include #define base 10000

using namespace std;

int b_max,h_max,n,k;

int c[600][600][60],ans[60];

void plus1(int a,int b,int c)

while (a[a[0] + 1])

++a[0];

}void plus2(int a,int b)

while (a[a[0] + 1])

++a[0];

}int main()

4 兩個有序陣列中第k小的數

參考 求兩個有序陣列中第k個元素。要求時間複雜度o log m n 空間複雜度o 1 def median num1,num2,k len1,len2 len num1 len num2 if len1 len2 k 首先得檢查合法行啊 return 1 index1,index2 0,0 whil...

遞迴打卡2 求兩個有序陣列的第K小數

給定兩個有序陣列arr1和arr2,已知兩個陣列的長度分別為 m1 和 m2,求兩個陣列中的第 k 小數。要求時間複雜度o log m1 m2 例如 arr1 1,2,3 arr2 3,4,5,6 k 4。則第 k 小數為 3.例如 arr1 0,1,2 arr2 3,4,5,7,8 k 3 則第 ...

檢視兩個int數的二進位制有幾位不同

題目 檢視兩個int 32位 數的二進位制有幾位不同。分析 要理解該題目的意思,就要明白c語言中關於位的一些操作符。1 按位與操作符,從低位到高位對兩個數的每位進行與操作,如1001 1101 1001,都為1則取1 2 按位或操作符,有乙個是1就取1 3 異或,不同則取1 4 非操作符,用來對乙個...