题目描述
给定一个正整数 k(3 ≤ k ≤ 15),把所有 k 的方幂及所有有限个互不相等的 k 的方幂之和构成一个递增的序列,例如,当 k=3 时,这个序列是:
1,3,4,9,10,12,13,…
(该序列实际上就是:3^0 , 3^1 , 3^0+3^1 , 3^2, 3^0+3^2 , 3^1+3^2 , 3^0+3^1+3^2 ,…)
请你求出这个序列的第 N 项的值,用 10 进制数表示。
例如,对于 k=3,N=100,正确答案应该是 981。
输入格式
两个由空格隔开的正整数 k ,N(3 ≤ k ≤ 15,10 ≤ N ≤ 1000)。
输出格式
一个正整数。整数前不要有空格和其他符号。
输入输出样例
输入
3 100
输出
981
思路
- 拿例题来理解题目,k=3,N=100 时表示这个序列是 1,3,4,9,10,12,13,…
- 将这组序列做成表格可能更加直观
-
方幂 3^0 3^1 3^0+3^1 3^2 3^0+3^2 3^1+3^2 3^0+3^1+3^2 进制 001 010 011 100 101 110 111 - 表格中的进制是三进制,但乍一看与二进制很相似,将表格中的三进制当作二进制来看的话就是 1 2 3 4 5 6 7,这就意味着第 N 项的值就是 N 的二进制序列,然后把这个进制序列当作k 进制序列来看就可以了
代码
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int n = sc.nextInt();
BigInteger sum = new BigInteger("0"); //这里要使用大整数,不然会越界
String s = Integer.toBinaryString(n); //将数字 N 转化为二进制序列
String[] split = s.split("");
for (int i = 0; i < split.length; i++) {
sum = sum.add(new BigInteger(split[split.length - i - 1]).multiply(num(i, k)));
}
System.out.println(sum);
}
public static BigInteger num(int n, int k) { //算出 k 的方幂
BigInteger binary = new BigInteger("1");
if (n == 0) {
return new BigInteger("1");
}
for (int i = 0; i < n; i++) {
binary = binary.multiply(new BigInteger(String.valueOf(k)));
}
return binary;
}
}