【題目描述】
設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 10000using 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 非操作符,用來對乙個...