解题思路:相当于是一个包含排列组合的动态规划,还包含高精度,要注意的是这个题的测试系统样例相对较小,所以int类型和一些错误写法也可以过去

注意事项:
这是拿排列组合做的,下来还会写动态二位数组的
参考代码:

import java.math.BigInteger;
import java.security.PKCS12Attribute;
import java.util.DoubleSummaryStatistics;
import java.util.Scanner;

public class Main {
	//这里是写了一个排列组合,在N1个数中取N2个(不能重复),变相满足了题目要求的大小排序要求
	public static long co(long N1,int N2) {
			if(N1<N2)
	            return 0;
			long res=1;
			for(int i=0;i<N2;i++)
			{
				 res=res*(N1-i);
			}
			for(int i=1;i<=N2;i++)
			{
				res/=i;
			}
			return res;
			
		}
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		//k代表2^k,w表示最大的二进制位数
		int k = scanner.nextInt();
		int w = scanner.nextInt();
		long sum = (long)Math.pow(2.0, k)-1;//求范围,也就是可以取得数
		int num = w/k;
		int flag = w%k;
		BigInteger S1=BigInteger.valueOf(0);//初始赋值是0
		BigInteger S2=BigInteger.valueOf(0);
		for(int i=2;i<=num;i++)//迎合要求,位数要大于二
		{
			S1 = S1.add(BigInteger.valueOf(co(sum,i)));//范围一定,求各个位数时的符合要求的数
		}
		long sum2 = (long)Math.pow(2.0, flag)-1;
		for(int i = 1;i <= sum2;i++)
		{
			//最前面的那个位数若存在,那么,他的值是固定的几个数,下面相当于定了开头,罗列这个开头下的情况
			 S2 = S2.add(BigInteger.valueOf(co(sum-i,num)));//相当于第一个数没有定义,确定了第一个数,又因为要比前面的大,所以要减i
		}
//		两种情况相加
		BigInteger end = S1.add(S2);
		System.out.println(end);
	
}
	}


点赞(0)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论