马彬涛


私信TA

用户名:2113043243

访问量:639

签 名:

等  级
排  名 26502
经  验 572
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校 中北大学
专  业

  自我简介:

TA的其他文章

解题思路:相当于是一个包含排列组合的动态规划,还包含高精度,要注意的是这个题的测试系统样例相对较小,所以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分

1 人评分

  评论区

  • «
  • »