题目描述
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
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,…)
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
输入格式
输入只有1行,为2个正整数,用一个空格隔开:
k N
(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
输出格式
输出为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*10^9)。(整数前不要有空格和其他符号)。
解题思路:这道题属于比较新颖的类型,关键是你能否找出规律,
3^0
3^1 3^1+3^0
3^2 3^2+3^0 3^2+3^1 3^2+3^1+3^0
......
所以规律为:每添加一个新的k的方幂,设该项为第X项,则它后面的X-1项为它与它前面的X-1项分别相加的结果。题目要求第N项,则在外层和内层均设置一个监听器,外层是指产生新的k的方幂的项,内层是指新的k的方幂与它前面所有项逐一相加。在两层循环中一旦监视到第N项出现,即刻退出循环,输出第N项。
具体代码:
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int Se[1002]; 5 int loc; 6 int n, k; 7 int temp; 8 int num; 9 while (cin >> k >> n){ 10 loc = 0; 11 num = 1; 12 while (loc < n){ 13 temp = loc; 14 Se[loc++] = num; 15 for (int i = 0; i < temp&&loc<n; i++) 16 Se[loc++] = num + Se[i]; 17 num *= k; 18 } 19 cout << Se[n - 1]; 20 } 21 return 0; 22 }
做题感悟:这类题其实不难,没有复杂的数据结构和算法,只要能找出规律即可设计出程序。同时注意学习更加简洁的代码写法,如Se[loc++] = num;不仅提高了逼格,而且使代码更加简洁。