原题链接:2^k进制数
解题思路:相当于是一个包含排列组合的动态规划,还包含高精度,要注意的是这个题的测试系统样例相对较小,所以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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复