数列

                                             讲解部分纯属来自一位大神,本人转载,代码为个人理解之后,敲的一个代码。

题目描述

给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:

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,…)

请你求出这个序列的第N项的值(用10进制数表示)。

例如,对于k=3,N=100,正确答案应该是981。

输入格式

输入只有1行,为2个正整数,用一个空格隔开:

k N

(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。

输出格式

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

思路如下   

     这一道题其实就是进制的转化,先把所有的N转化成2进制的形式,用数组存起来,数组下标就是对应的幂,然后用k的幂全部加起来

     比如100的二进制是1100100,那么这道题就是2^6+2^5+2^2 ,然后转化成k 就是k^6+k^5+k^2

      1,3,4,9,10,12,13,27,28,30… 这是k=3的时候 , 10是怎么来的,其实就是1+9 ,3+9 , 4+9,而9就是3^2,前面的数逐个跟k次幂相加得到的,k次幂前有多少个数,后面就有多少个数

      1 2 3 4 5 6 7 ... 这是k=2的时候,就更加容易发现了,5是由1+4,6是2+4 ,7是3+4

思考100 如何组成,其实就是64+32+4,64是第64个数,你会发现其实无论k怎么变,k次幂前的数都是成倍增加,所 以就是这个规律


代码如下

#include <iostream>
#include <math.h>
using namespace std;

int a[105],index;

int main()
{
    int k,x;
    cin>>k>>x;
    index =0;
    while(x)
    {
        a[index++] = x%2;
        x = x/2;
    }
    long long ans = 0;
    for(int i = index-1; i>=0; i--)
    {
        if(a[i]==1)
        {
            int s = 1;
            for(int j=0; j<i; j++)
                s = s*k;
            ans+=s;
        }
    }
    cout<<ans<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值