题目描述:
给定一个正整数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)。(整数前不要有空格和其他符号)。
解题思路:
首先,我们需要找到这个数列的规律。
不妨令k=3,先穷举数列的前几项找规律 ,在推广至一般情况
第n项 | 元素大小 | 用3(k)进制表示 | 用十进制表示 |
---|---|---|---|
1 | 30 | 1 | 1*30 |
2 | 31 | 10 | 1* 31 +0 *30 |
3 | 31+30 | 11 | 1 * 31+1 * 30 |
4 | 32 | 100 | 1 * 32+0 * 31+0 * 30 |
总结 :
这个数列的特点:无论k取何值,所形成的数列用k进制表示都是一致的。
现在给出这个数列的一般规律
第n项 | 元素大小 | 用k进制表示 | 用十进制表示 |
---|---|---|---|
1 | k0 | 1 | 1 * k0 |
2 | k1 | 10 | 1 * k1+0 * k0 |
3 | k1+k0 | 11 | 1 * k1+1 * k0 |
4 | k2 | 100 | 1 * k2+0 * k1+0 * k0 |
现在的问题是:如何知道第n项用k进制表示的结果
即:在已知k的情况下,如果n=5,我们要通过101求出这个元素的值。
但是怎么求出101这个数呢?
相信你已经发现了,101就是5的二进制。
所以,以上的表格可以改为
第n项 | 元素大小 | n的二进制 | 用十进制表示 |
---|---|---|---|
1 | k0 | 1 | 1 * k0 |
2 | k1 | 10 | 1 * k1+0 * k0 |
3 | k1+k0 | 11 | 1 * k1+1 * k0 |
4 | k2 | 100 | 1 * k2+0 * k1+0 * k0 |
代码
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int k,n,m;
long long sum = 0;
int count = 0;
cin>>k>>n;
while(n){
m = n%2;
sum +=m*pow(k,count);
count++;
n/=2;
}
cout<<sum;
}
解析
大家可能看不懂while循环的内容,这里是解释。
举例说明:
好了,大家学会了吗?