[一道好题] [NOIP2006]数列 题解(用c++实现)

题目描述:

给定一个正整数k( 3 ≤ k ≤ 15 ),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k =
3时,这个序列是:
1,3,4,9,10,12,13,…(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。例如,对于k = 3,N = 100,正确答案应该是 981。

输入描述: 输入1行,为2个正整数,用一个空格隔开:k N(k、N的含义与上述的问题描述一致,且3 ≤ k ≤ 15,10 ≤ N ≤ 1000 )。

输出描述:

输出一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。


解题思路:

首先,我们需要找到这个数列的规律。

不妨令k=3,先穷举数列的前几项找规律 ,在推广至一般情况

第n项元素大小用3(k)进制表示用十进制表示
13011*30
231101* 31 +0 *30
331+30111 * 31+1 * 30
4321001 * 32+0 * 31+0 * 30

总结
这个数列的特点
无论k取何值,所形成的数列用k进制表示都是一致的。
在任何k下都是一致的

在这里插入图片描述

现在给出这个数列的一般规律

第n项元素大小用k进制表示用十进制表示
1k011 * k0
2k1101 * k1+0 * k0
3k1+k0111 * k1+1 * k0
4k21001 * k2+0 * k1+0 * k0

现在的问题是:如何知道第n项用k进制表示的结果
即:在已知k的情况下,如果n=5,我们要通过101求出这个元素的值。
但是怎么求出101这个数呢?
相信你已经发现了,101就是5的二进制。
所以,以上的表格可以改为

第n项元素大小n的二进制用十进制表示
1k011 * k0
2k1101 * k1+0 * k0
3k1+k0111 * k1+1 * k0
4k21001 * k2+0 * k1+0 * k0

代码

#include<iostream>
#include<cmath>
using namespace std;
int main(){
   int k,n,m;
   long long sum = 0;
   int count = 0;
   cin>>k>>n;
   while(n){
       m = n%2;
       sum +=m*pow(k,count);
       count++;
       n/=2;
   } 
   cout<<sum;
}

解析

大家可能看不懂while循环的内容,这里是解释。

举例说明:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了,大家学会了吗?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值