l


私信TA

用户名:dotcpp0632881

访问量:108

签 名:

等  级
排  名 3481
经  验 1919
参赛次数 3
文章发表 1
年  龄 0
在职情况 学生
学  校 河北农业大学渤海校区
专  业

  自我简介:

TA的其他文章

解题思路:

本题采用排列组合的方式,保证严格递增,以题目为例,共七位,分为三组;

  1. 最高位为0时,只需要后两位严格递增即可,如何保证呢,从范围内抽取两个数即可满足,抽取两个数,我们就指定它用递增方式去放。所以我们只需要满足从1-7中抽取两个数即可满足。

  2. 最高位不为0时,可以采用for循环遍历的方式,遍历最高位的值。指定最高位,后两位用排列组合的方式,不过后两位的范围要对应发生更改,只需要用上面的范围减去最高位的值,抽取的位数保持不变。


注意事项:

       排列组合的关键点在于:我们不需要去满足严格递增,因为当我们从几个数中,抽出两个数时,这个数就有一种情况来满足题目所需,即我们讲抽出来的数,按照要求放好即可,那么就转变成了抽取有多少种情况,即排列组合。

       除此之外,我们还需要去考虑,是否整除,如果整除,则不需要考虑最高位,因为最高位和其它没有什么区别,当不整除时,由于高位与低位的范围不一致,所以分开进行考虑。

下面是组合的代码:

int jiecheng(int x){//阶乘
	long long ret=1;
	for(int i=x;i>0;i--){
		ret *=i;
		
	}
	return ret;
}

int c(int x,int y){//组合
	
	long long int ret=0;
	
	ret=jiecheng(x)/jiecheng(y)/jiecheng(x-y);
	return ret;
}


参考代码:

#include<bits/stdc++.h>
using namespace std;

int jiecheng(int x){
	long long ret=1;
	for(int i=x;i>0;i--){
		ret *=i;
		
	}
	return ret;
}

int c(int x,int y){
	
	long long int ret=0;
	
	ret=jiecheng(x)/jiecheng(y)/jiecheng(x-y);
	return ret;
}
int main(){
	int k,w;
	cin>>k>>w;
	int wei=w/k;
	int max=pow(2,k)-1;
	int zui=pow(2,w%k)-1;
	long long int sum=0;
	//最高位是0,或正好w/k整除

	if(w%k){
		for(int i=2;i<=wei;i++){
			sum+=c(max,i);
		
		} 
		for(int i=1;i<=zui;i++){
			sum+=c(max-i,wei);
		}
	}
	
	if(w%k==0){
		for(int i=2;i<=wei;i++){
			sum+=c(max,i);
		} 
		
	}
	 cout<<sum;
	
	
	
	
	
	
	return 0;
}


 

0.0分

1 人评分

  评论区


                        
2022-12-25 10:20:18
  • «
  • 1
  • »