原题链接: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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复