题目详情:
给定一个正整数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 )。
解题思路:
a1 = 1
a2 = k
a3 = a1+a2
a4 = k^2
a5 = a1 + a4
a6 = a2 + a4
a7 = a3 + a4
a8 = k^3
a9 = a1 + a8
a10 = a2 + a8
a11 = a3 + a8
a12 = a4 + a8
...
a16 = k^4
a17 = a1 + a16
....
观察下标是不是2的指数倍
是,算出2的上标,pow(k,X)
不是,算出最近的那个2的上标,现有下标减去2的上标,再递归调用函数
#include <iostream>
#include <cmath>
using namespace std;
#define int long long
/**
* 判断 x 是不是 2 的 k(k为正整数)次方
*/
bool judgePow2(int x)
{
int y = log(x) / log(2);
int result = pow(2,y);
return result == x;
}
/**
* 递归
*/
int add(int n, int k)
{
if(n==1) return 1;
if(n==2) return k;
if(judgePow2(n) == true) {
int p = log(n)/log(2);
int result = pow(k,p);
return result;
}
int temp = log(n)/log(2);
int base = pow(k,temp);
int temp2 = pow(2,temp);
return base + add(n-temp2,k);
}
signed main()
{
int m,n;
cin>>m;
cin>>n;
cout<<add(n,m)<<endl;
return 0;
}