题目
给定一个正整数k( 3 ≤ k ≤ 15 ),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k = 3时,这个序列是:
1,3,4,9,10,12,13,…(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。例如,对于k = 3,N = 100,正确答案应该是 981。
输入描述:
输入1行,为2个正整数,用一个空格隔开:k N(k、N的含义与上述的问题描述一致,且3 ≤ k ≤ 15,10 ≤ N ≤ 1000 )。
输出描述:
输出一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。
示例1
输入
复制3 100
3 100
输出
复制981
981
解析
设第一个数为a_1,依次类推第n个则为a_n
a_1 | a_2 | a_3 | a_4 | a_5 | a_6 | a_7 | a_8 | a_9 |
1 | k^1 | 1+k^1 | k^2 | k^2+1 | k^2+2 | k^2+3 | k^3 | k^3+1 |
着重关注2,4,8(2的倍数) 先判断该数是不是2的倍数
a_2 = k^1
a_3 = a_2+a_1
a_4 = k^2
a_5 = k^2+a_1
...
a_n = ?
法一:
给定一个数组,数组的下标则是该数所在位置。
法二:
递归解法。
代码区
法一代码:
#include <iostream>
#include<stdio.h>
using namespace std;
int main() {
int k, n;
cin >> k >> n;
int sum[1011] = { 0 };
sum[0] = 1;
sum[1] = 1;
for (int i = 2; i <= n; i++) {
int num = (int)(log(i) / log(2));
if (i==pow(2, num)) {
sum[i]=pow(k, num);
}
else {
int q = pow(2, num);
sum[i] = pow(3, num) + sum[i - q];
}
}
cout << sum[n];
return 0;
}
法二代码:
#include <iostream>
using namespace std;
int fu(int k, int n);
int fu(int k,int n) {
int num = (int)(log(n) / log(2));
if (n == 0)return 0; //注意当n==0时,num的运行并不会停止。
int q = pow(2, num);
if (n == 1)return 1;//为1和2时,给定返回值
if (n == 2)return 2;
/*int sum=0;
if (n == pow(2, num)) {
sum += pow(k, num);
cout << sum;
}*/
int an = pow(k, num) + fu(k, n - q);
return an;
}
int main() {
int k , n;
cin >> k >> n;
int sum;
int num = (int)(log(n) / log(2));//判断该数是否为2的倍数。
if (n == pow(2, num)) {
sum = pow(k, num);
cout << sum;
}
else {
cout << fu(k, n);
}
return 0;
}