蓝桥杯 算法训练 数列

问题描述
  给定一个正整数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)。(整数前不要有空格和其他符号)。
样例输入
3 100
样例输出
981


第一眼看上去感觉挺难处理的,仔细想想就找到了规律。我们以k=3为例,只需要找出每一个3的方幂,然后用当前找出的3的方幂和前面所有数分别相加即可得到当前3的方幂后面的数,前面的数全部用完后下一个数就是3的下一个方幂。用题目给的例子来说明就是

10=9+1

12=9+3

13=9+4

此时3的方幂9之前的数全部用完,于是再下一个数就是3的3方幂27,这样的话就变成一道简单的模拟题啦,代码如下:

#include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>
#include<cstring>
#include<cmath>
#define Inf 99999999
using namespace std;
int main()
{
    int k,n;
    scanf("%d%d",&k,&n);
    int num[1010];
    num[1]=1;
    num[2]=k;
    int sum=k;
    int index=2;
    while(1)
    {
        for(int i=1;i<index;i++)
        {
            num[index+i]=num[index]+num[i];
            if(index+i>=n)
            break;
        }
        index*=2;
        if(index>n)
        break;
        sum*=k;
        num[index]=sum;
    }
    printf("%d",num[n]);
    return 0;
}


猜你喜欢

转载自blog.csdn.net/langzitan123/article/details/80248929
今日推荐