数列
题目来源:NOIP2006普及组
时间限制: 1000 m s 1000ms 1000ms 内存限制: 64 m b 64mb 64mb
题目描述
给定一个正整数 k k k ,把所有 k k k 的方幂及所有有限个互不相等的 k k k 的方幂之和构成一个递增的序列,例如,当 k = 3 k=3 k=3 时,这个序列是:
1 , 3 , 4 , 9 , 10 , 12 , 13 , … 1,3,4,9,10,12,13,… 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 , … 3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,… 30,31,30+31,32,30+32,31+32,30+31+32,…
请你求出这个序列的第 N N N 项的值( 用10进制数表示 )。
例如,对于 k = 3 , N = 100 k=3,N=100 k=3,N=100 时,正确答案应该是 981 981 981 。
输入格式
输入1行,为 k k k、 N N N 两个正整数,用一个空格隔开。
输出格式
输出一个正整数为计算结果(在所有的测试数据中,结果均不超过 2.1 ∗ 1 0 9 2.1∗10^9 2.1∗109 )。
(整数前不要有空格和其他符号)。
数据范围
3 ≤ k ≤ 15 3 ≤ k ≤ 15 3≤k≤15 ,
10 ≤ N ≤ 1000 10 ≤ N ≤ 1000 10≤N≤1000
样例输入
3 100
样例输出
981
解题思路
继续延长题目给出的串为 3 3 , 3 0 + 3 3 , 3 1 + 3 3 , 3 0 + 3 1 + 3 3 , 3 2 + 3 3 , 3 0 + 3 2 + 3 3 , 3 1 + 3 2 + 3 3 , 3 0 + 3 1 + 3 2 + 3 3 , … 3^3,3^0+3^3,3^1+3^3,3^0+3^1+3^3,3^2+3^3,3^0+3^2+3^3,3^1+3^2+3^3,3^0+3^1+3^2+3^3,… 33,30+33,31+33,30+31+33,32+33,30+32+33,31+32+33,30+31+32+33,…
即: 3 , 03 , 13 , 013 , 23 , 023 , 123 , 0123 , … 3,03,13,013,23,023,123,0123,… 3,03,13,013,23,023,123,0123,…
规律并不是按多项式的项数来排列的,所以无法用排列数算出具体的项数。
第一个思路:
3的次方上面观察规律,即对 0 , 1 , 01 , 2 , 02 , 12 , 012 , … 0,1,01,2,02,12,012,… 0,1,01,2,02,12,012,… 观察。
因为每一个次方的数在一项中仅出现一次,用二进制从右往左看,第几位有则第几位为1,其它位为0,比如第一项是 0 0 0,看成二进制从右往左第0位为1,即二进制的 1 1 1 ;第二项是 1 1 1 ,看成二进制从右往左第1位为1,即二进制的 10 10 10 。
所以上面的串可以转换为 1 , 10 , 11 , 100 , 101 , 110 , 111 , … 1,10,11,100,101,110,111,… 1,10,11,100,101,110,111,…
然后发现这段就是二进制的 1 , 2 , 3 , 4 , 5 , 6 , 7 , … 1,2,3,4,5,6,7,… 1,2,3,4,5,6,7,…
所以第100项为: 1100100 1100100 1100100,即 2 , 5 , 6 2,5,6 2,5,6 ,所以答案为 3 2 + 3 5 + 3 6 = 981 3^2+3^5+3^6=981 32+35+36=981
第二个思路:
观察数列 1 , 3 , 4 , 9 , 10 , 12 , 13 , … 1,3,4,9,10,12,13,… 1,3,4,9,10,12,13,… 发现:
其用三进制的表示为 1 , 10 , 11 , 100 , 101 , 110 , 111 , … 1,10,11,100,101,110,111,… 1,10,11,100,101,110,111,…
然后发现这段就是二进制的 1 , 2 , 3 , 4 , 5 , 6 , 7 , … 1,2,3,4,5,6,7,… 1,2,3,4,5,6,7,…
由此得到题解,将输入的 N N N 用二进制的形式表示出来,然后再将其用 k k k 进制展开转换为10进制。
解题代码-Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int k = input.nextInt();
String n = Integer.toBinaryString(input.nextInt());
input.close();
int j = n.length() - 1;
int ans = 0;
for (char ch : n.toCharArray()) {
if (ch == '1') {
ans += Math.pow(k, j);
}
j--;
}
System.out.println(ans);
}
}