解题思路:

1:对于要考虑到的从高位开始一直往低位走,右边严格大于左边要如何去处理

   解:实际上,这个地方有一个坑,去诱惑你处理这个数位之间的大小关系排序,可实际上并不需要处理,因为每个数位上的数必然时不重复的,那么我就默认者一组数它就是严格排序的,比如说原来的一组数时321(不符合要求),但我就可以认为它是123(符合要求),发现了吗,就是说,重点是放入的那一组数,它的顺序顺序并不重要。


2:要从k和w 中分析出怎样的信息?(k<w)

     解:2^k表示的是进制,自然K就是将此进制数化为二进制数时的位数,那么我们就可以通过w/k,得到最小的r的位数;通过w%k得到最高位的取值范围(当w可以除尽k时,最高位的取值范围自然就是1~pow(2,k)-1)了。


3:下一步如何去分析?(敲黑板)

A:以题中的k=3,w=7为例子分析:

1647770079264324.jpg

B:其他例子:w%k==0的情况 和 位数更多的情况(此时心里默认最高位为0)

1647770163464525.jpg




注意事项:    要考虑到一个细节问题:当给出的位数限制w/k甚至大于 “最大的进制数-1” 时,要将w缩小至与其等值 ,例如

1647770740989723.jpg





参考代码:

#include

#include

long woc(int m,int n)//进行无序排序 

{

long sum=1;

for(int i=0;i<n;i++)

{

sum*=(m-i);

}

for(int i=2;i<=n;i++)

{

sum/=i;

}

return sum;

}

int main()

{

int k,w,mi,ma,index,x;//注意index用于确定最高位的取值范围

long sum=0;

scanf("%d%d",&k,&w);

mi=w/k;

ma=w%k;

x=pow(2,k);

if((x-1)<mi)//当给出的位数限制w/k甚至大于 最大的进制数-1 时,要将w缩小至与其等值 ,例如

{

mi=x-1;

}

if(ma!=0) //除不尽 

{

if(ma==1)

{

index=1;

}

else

{

index=1;

for(int i=1;i<ma;i++)

{

index*=2;

}

index+=1;

}

sum=woc(x-1,mi+1)-woc(x-1-index,mi+1);

}

for(int i=2;i<=mi;i++)//除得尽时或者是处理高位以外排列 

{

sum+=woc(x-1,i);

}

    printf("%ld\n",sum);

return 0;

}


点赞(0)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论