【洛谷】P1062 数列(栈 + 进制数)题解

原题地址: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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值