## 题目 1110: 2^k进制数

时间限制: 1Sec 内存限制: 128MB 提交: 1499 解决: 737

提交地址：

https://www.dotcpp.com/oj/problem1110.html

**题目描述**

```
设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 的段，每段对应一位2^k进制的数，如果S至少可分成2段，则S所对应的二进制数又可以转换为上述的2\^k 进制数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位）

**样例输入**

```python
3  7
```

**样例输出**

```python
36
```

参考答案：


```
k,w=map(int,input().strip().split())
Digits=w//k #  可以有完整k位的位数 
remainder=w%k   # 最高位余下的位数
def f (count,Digit):
    if Digit>count:
        return 0
    re=1
    for i in range(1,Digit+1):
        re*=(count-i+1)/i
    return re
s0=sum([f(2**k-1,i) for i in range(2,Digits+1)]) #不考虑最高位或者说是只考虑所有的位数都有完整k位的情况。那么对于每一个位数的可能数就是从2**k-1中选取位数个数字的所有可能性

s1=sum([f(2**k-1-i,Digits) for i in range(1,2**remainder)])# 依次计算最高位取每一个可能的数字时所有的可能性。
print(int(s0+s1))
```

    3 7
    36







