本文主要是介绍【OJ】把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
给定一个正整数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*10^9)。(整数前不要有空格和其他符号)。
样例输入
3 100
样例输出
981
解题代码
基本思路:
拿出草稿纸和笔,计算发现基本满足以下规律:
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
....
#include <iostream>
#include <cmath>
using namespace std;/*** 判断 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);
}int main()
{int m,n;cin>>m;cin>>n;cout<<add(n,m)<<endl;return 0;
}
总结
这个题目本身不难,但是千万别被自己绕晕了……另外,这是我第一次自己用递归解决问题(除了那个路人皆知的阶乘这类的),值得记录一下。
Smileyan
2019年9月16日
这篇关于【OJ】把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!