原题地址:https://www.luogu.org/problem/P1062
题目描述
给定一个正整数k (3 ≤ k ≤ 15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当 k=3 时,这个序列是:
1 , 3 , 4 , 9 , 10 , 12 , 13 , … 1,3,4,9,10,12,13,… 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项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
输入输出格式
输入格式:
2个正整数,用一个空格隔开:
k N (k、N的含义与上述的问题描述一致,且3 ≤k≤ 15,10 ≤N≤ 1000)。
输出格式:
1个正整数。(整数前不要有空格和其他符号)。
输入输出样例
输入样例#1:
3 100
输出样例#1:
981
说明
时空限制:1000ms,128M
NOIP 2006 普及组 第四题
思路:这就像是一道规律题,先将十进制下的数列,转换为k进制后,再将其当作二进制转换为十进制,会发现,第n项就是n。
比如题目例子:
k=3时,数列为:1,3,4,9,10,12,13…
转换成三进制:1,10,11,100,101,110,111…
将其当作二进制,转化成十进制:1,2,3,4,5,6,7…
可以发现,第n项就是n
所以,现在知道k和n,就可以逆着来,先将n转换为二进制,再把转换后的数当成k进制下的数,再次转换为十进制。
同时,栈后进先出的性质刚好运用到这道题来,先把转换为二进制后的数,从后往前一个个边压入栈边右移,最后再边出栈边删除栈顶,把出栈的数转换为十进制数后累加起来。
代码如下:
#include <iostream>
#include <cstdio>
#include <stack>
#include <cmath>
using namespace std;
typedef long long ll;
int main(){
ios::sync_with_stdio(0);
stack<int> s; //定义一个空栈
ll n,k;
cin>>k>>n;
while(n){ //当n不为0
s.push(n&1); //把n转换为二进制后把最后一个压入栈
n>>=1; //n的二进制数向右移一位
}
ll ans=0; //初始化为0
while(!s.empty()){ //当栈不为空
ans+=s.top()*pow(k,s.size()-1); //把栈顶转换为k进制数累加
s.pop(); //删除栈顶
}
cout<<ans<<endl; //输出转换为k进制后的数
return 0;
}