解题思路:相当于是一个包含排列组合的动态规划,还包含高精度,要注意的是这个题的测试系统样例相对较小,所以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 人评分
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:1267 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:658 |
wu-理财计划 (C++代码)浏览:907 |
矩阵加法 (C语言代码)浏览:1768 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:569 |
字符删除 (C语言代码)浏览:767 |
简单的a+b (C语言代码)浏览:672 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:477 |
孤独的骑士 (C语言代码)浏览:1416 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:680 |