肖黄清


私信TA

用户名:uq_24402228243

访问量:3725

签 名:

等  级
排  名 5259
经  验 1567
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

1.先求出 k位二进制数(因为其他进制数均可用二进制表示,eg.1个8进制 可用 3个二进制 表示) 所能表示的最大值s(即 2^k - 1);
2.再求出 该数可能的 最多位数m(即 w / k + 1),但是后面需要用到while(m --)循环,则不用 + 1 ;
3.循环 m-1 次(因为不考虑 1位数):每次从 s个数 中选2个,则有 s * (s - 1) / 2 种方案;
4.每次循环结束时,s 需要自减1 ,表示下一次 从 s-1个数 中选。

注意事项:

1.由于k≤9,w≤30000,则结果ans最大(k=9,w=30000)为 3 7678 24291 ,超过int的4字节的范围,所以得使用long long (实际测试中,使用int也可通过);
2.1 << k 表示 将1右移k位 ,相当于 2^k ;
3.由于ans为 全局变量,默认初始化为0 (否则得手动初始化)。

参考代码:

#include<stdio.h>
int k, w, s;
long long ans;
int main(){
	scanf("%d %d", &k, &w);
	s = (1 << k) - 1;
	int m = w / k;//该数最多可能为m + 1位数
	while(m --){//m + 1位数,循环m次(循环到2位数则结束。eg.3位数,则循环2次) 
		ans += s * (s - 1) / 2;
		s --;
	}
	printf("%lld", ans);
	return 0;
}


 

0.0分

2 人评分

  评论区

  • «
  • »