2^k進位制數
題目描述
設r是個2^k 進位制數,並滿足以下條件:
(1)r至少是個2位的2^k 進位制數。
(2)作為2^k 進位制數,除最後一位外,r的每一位嚴格小於它右邊相鄰的那一位。
(3)將r轉換為2進位制數q後,則q的總位數不超過w。
在這裡,正整數k(1≤k≤9)和w(k〈w≤30000)是事先給定的。
問:滿足上述條件的不同的r共有多少個?
我們再從另一角度作些解釋:設S是長度為w 的01字串(即字串S由w個“0”或“1”組成),S對應於上述條件(3)中的q。將S從右起劃分為若干個長度為k 的段,每段對應一位2k進位制的數,如果S至少可分成2段,則S所對應的二進位制數又可以轉換為上述的2k 進位制數r。
例:設k=3,w=7。則r是個八進位制數(2^3=8)。由於w=7,長度為7的01字串按3位一段分,可分為3段(即1,3,3,左邊第一段只有一個二進位制位),則滿足條件的八進位制數有:
2位數:高位為1:6個(即12,13,14,15,16,17),高位為2:5個,…,高位為6:1個(即67)。共6+5+…+1=21個。
3位數:高位只能是1,第2位為2:5個(即123,124,125,126,127),第2位為3:4個,…,第2位為6:1個(即167)。共5+4+…+1=15個。
所以,滿足要求的r共有36個。
輸入
只有1行,為兩個正整數,用一個空格隔開:
k w
輸出
1行,是一個正整數,為所求的計算結果,即滿足條件的不同的r的個數(用十進位制數表示),要求最高位不得為0,各數字之間不得插入數字以外的其他字元(例如空格、換行符、逗號等)。
(提示:作為結果的正整數可能很大,但不會超過200位)
樣例輸入
3 7
樣例輸出
36
寫題思路:說實話,一開始我也是不知道怎麼寫,找規律寫的,結果只對了例子,是在是沒招了回去看題解,發現使用排列組合的公式可以直接做出來,之後才恍然大悟,不要臉的直接借鑑了一下大佬的子函式過來,之後按照自己的理解整理出來的演算法。
原來的題解連線
程式碼如下:
#include<iostream>
using namespace std;
long C(int n,int m) //C(n-1)(m)計算排列數,其中n為最大數值+1(進位制),m為當前位置
{
int i;
long sum=1;
for(i=1;i<=m;i++)
sum*=(n-i);
for(i=2;i<=m;i++)
sum=sum/i;
return sum;
}
int main(){
int k, w;
long sum = 0;
cin>>k>>w;
int yu, zheng;
yu = w % k; //餘數
zheng = w / k + 1; //整數
int jinzhi = 1;
jinzhi <<= k; //2^k進位制數
for(int i = 2; i < zheng; i++){
sum += C(jinzhi,i);
}
if(yu != 0){ //計算最高位的排列數
sum += (C(jinzhi, zheng) - C(jinzhi - yu, zheng));
}
cout<<sum;
return 0;
}
相關文章
- C語言中printf打出2進位制與16進位制數C語言
- 10進位制 VS 2進位制
- 十六進位制數轉十進位制
- JavaScript 進位制轉換(2進位制、8進位制、10進位制、16進位制之間的轉換)JavaScript
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- C# 2進位制、8進位制、10進位制、16進位制...各種進位制間的輕鬆轉換C#
- 八進位制,十六進位制和浮點數
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 進位制均值-進位制轉換+最大公約數
- 2進位制_8進位制_16進位制之間快速轉換的技巧.txt
- 在c語言中輸出8進位制數,16進位制數C語言
- 負數補碼(16進位制轉10進位制的負數)
- k8s二進位制部署K8S
- JavaScript 二進位制數字轉換為十進位制JavaScript
- printf()將10進位制數安照輸出16進位制,8進位制輸出
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- 進位制詳解:二進位制、八進位制和十六進位制
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- javascript十進位制數字和二進位制相互轉換JavaScript
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 03:八進位制小數
- 數的進位制轉換
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- 如何把十進位制的數輸入用二進位制全加器,並以十進位制輸出
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- Qt進位制轉換(十進位制轉十六進位制)QT
- 1474 十進位制轉m進位制+1475 m進位制轉十進位制
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 二進位制方式安裝 k8sK8S
- n進位制轉十進位制
- 十進位制轉十六進位制
- 關於10進位制轉2進位制的C語言程式碼C語言