[NOIP2006 普及组] 数列
题目描述
给定一个正整数 k k k( 3 ≤ k ≤ 15 3\leq k\leq 15 3≤k≤15),把所有 k k k 的方幂及所有有限个互不相等的 k k k 的方幂之和构成一个递增的序列,例如,当 k = 3 k = 3 k=3 时,这个序列是:
1 , 3 , 4 , 9 , 10 , 12 , 13 , … 1, 3, 4, 9, 10, 12, 13, \ldots 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 , … 3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,… 30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第 N N N 项的值,用 10 10 10 进制数表示。
例如,对于 k = 3 k = 3 k=3, N = 100 N = 100 N=100,正确答案应该是 981 981 981。
输入格式
两个由空格隔开的正整数 k , N k, N k,N( 3 ≤ k ≤ 15 3\leq k\leq 15 3≤k≤15, 10 ≤ N ≤ 1000 10\leq N\leq 1000 10≤N≤1000)。
输出格式
一个正整数。整数前不要有空格和其他符号。
样例 #1
样例输入 #1
3 100
样例输出 #1
981
题目来源
NOIP 2006 普及组 第四题(洛谷)
题解
#include <iostream>
#include <stack>
#include <cmath>
using namespace std;
long long k, n, ans; // 声明全局变量k, n和结果ans
stack<int> S; // 声明一个栈S用于存储n的二进制位
int main() {
cin >> k >> n; // 读取输入的k和n
while(n) {
S.push(n & 1); // 将n的最低位压入栈中(n & 1取最低位)
n >>= 1; // n右移一位,处理下一位
}
while(!S.empty()) {
ans += S.top() * pow(k, S.size()-1); // 计算当前二进制位对应的k进制幂次并累加到ans
S.pop(); // 移除栈顶元素
}
cout << ans << endl; // 输出最终结果
return 0;
}