题目描述
给定一个正整数 �k(3≤�≤153≤k≤15),把所有 �k 的方幂及所有有限个互不相等的 �k 的方幂之和构成一个递增的序列,例如,当 �=3k=3 时,这个序列是:
1,3,4,9,10,12,13,…1,3,4,9,10,12,13,…
(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第 �N 项的值,用 1010 进制数表示。
例如,对于 �=3k=3,�=100N=100,正确答案应该是 981981。
输入格式
两个由空格隔开的正整数 �,�k,N(3≤�≤153≤k≤15,10≤�≤100010≤N≤1000)。
输出格式
一个正整数。整数前不要有空格和其他符号。
输入输出样例
输入 #1复制
3 100
输出 #1复制
981
说明/提示
NOIP 2006 普及组 第四题
(题目为啥要强调用十进制输出呢,明明就是故意提醒)
分析一下样例
�=3k=3时,数列为:1,3,4,9,10,12,13..1,3,4,9,10,12,13..
转换成三进制就是:1,10,11,100,101,110,111..1,10,11,100,101,110,111..
看起来像是二进制,转化成十进制看看
1,2,3,4,5,6,7..1,2,3,4,5,6,7..
显然,第�n项就是�n.
程序就把这个过程逆回去,先把�n转换成二进制,再把它当成�K进制,重新转换为十进制.
#include <iostream>
#include <stack>
#include <cmath>
using namespace std;
long long k, n, ans;
stack<int> S;
int main() {
cin >> k >> n;
while(n) S.push(n & 1), n >>= 1;
while(!S.empty()) ans += S.top() * pow(k, S.size()-1), S.pop();
cout << ans << endl;
return 0;
}
updupd : 2018/10/262018/10/26 添加LaTeXLaTeX公式,麻烦管理员通过审核