解题思路:
观察给的例子,当k = 3, w = 7的时候,因为将7位2进制数三位三位的分割最多分割成三块,所以最多只有三位数的情况,而这个数最小是两位,所以只有两位数和三位数两种情况,由此可以知道,对于每一个k和w,出现的位数情况为w / k(因为从两位数开始考虑所以不用减1),由观察可知,这个数是两位数的时候,它的最低位的最大值7就是其二进制数被分割的时候,最先被分割出的那一块的数,本例中即为111(二进制数),也就是1 + 2 + 4 = 7,而该数为两位数时的所有情况其实就是1到7共7个数字的排列组合,也就是C72 = 21,同理,该数为三位数时的所有情况就是C62 = 30,所以就找到了规律,对于每个2k进制数,从其为两位数的情况开始,每种情况的数量依次为Cs2 = s * (s - 1) / 2,s逐渐递减,且s = 2k - 1,再把每种情况的数量加起来就得到了答案
参考代码:
#include<iostream>
using namespace std;
int k, w;
long long res;
int main()
{
cin >> k >> w;
long long s = 1;
for (int i = 1; i <= k; i ++) s *= 2;
s --; //该数为两位数时其最低位的最大值
int m = w / k; //该数最多可能为m + 1位数,因为从2位数开始看所以不用加一
while (m --)
{
res += s * (s - 1) / 2;
s --;
}
cout << res << endl;
return 0;
}
0.0分
4 人评分
最小公倍数 (C语言代码)浏览:895 |
打水问题 (C语言代码)浏览:1148 |
计算质因子 (C++代码)浏览:1826 |
WU-蓝桥杯算法提高VIP-勾股数 (C++代码)浏览:1685 |
【偶数求和】 (C语言代码)浏览:588 |
校门外的树 (C语言代码)浏览:733 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:716 |
IP判断 (C语言描述,蓝桥杯)浏览:1118 |
文科生的悲哀 (C语言代码)浏览:1538 |
A+B for Input-Output Practice (III) (C语言代码)浏览:594 |