#include <stdio.h>
#include <math.h>
long C(int ,int );                   //为C(n+m-1)(m)计算排列数,其中n为当前位置的数值,m为当前位置
void main()
{
	long sum=0,max;              //sum用于计算符合的总数,max为X进制
	int k,w,weis,gaow,i;         //k,w为输入,weis为位数,gaow为有效最高位的数值,i用于循环
	scanf("%d%d",&k,&w);
	max=pow(2.0,k);             //以题中输入3,7为例,max=8,表示八进制
	weis=w/k+1;                 //weis位数为3
	gaow=pow(2.0,w%k)-1;        //gaow为最高位数值为1
	if (max-weis<=gaow)         //根据题目,可知最高位的数字最大为max-weis,故为gaow赋予有效最高位数值
		gaow=max-weis;      //gaow等于1
	for (i=2;i<weis;i++)        //从第二位开始(从右往左),对每一位数时计算排列数
		sum+=C(max-i,i);    //给sum求和
	sum+=(C(max-weis,weis)-C(max-weis-gaow,weis));    //计算最高位时的排列数
	printf("%ld",sum);
}
long C(int n,int m)                 //公式为C(n+m-1)(m)[重点]
{
	int i;
	long sum=1;
	for (i=1;i<=m;i++)
		sum*=(n+m-i);	
	for (i=1;i<=m;i++)
		sum=sum/i;
	return sum;
}

解题思路:
数学问题




注意事项:
声明变量时的类型




参考代码:

点赞(6)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 6 条评论

榎本贵音 6年前 回复TA
大牛,我实在不理解为什么要用C(n+m-1)(m)计算,我直接用C(n+1)(m)计算显示是对的,参考你的写了篇题解
后知后觉 7年前 回复TA
奥,你这个我懂了,但是为啥这样写就不越界了,我直接用Cnm计算的就越界
后知后觉 7年前 回复TA
大佬,为啥你的排列组合用的这种公式,n+m-1能不能再解释一下,还有就是看你程序也没有处理高精度,为啥没有越界,我的最后出现越界情况?
花落 7年前 回复TA
@Kevin 我用itoa 和atoi试一试
花落 7年前 回复TA
@Kevin 2333小文,这题用itoa函数试试
Kevin 7年前 回复TA
沙发,前排围观大神
赋予代码灵魂,追求极致性能