[终于可以自由的写出来了]数列

【题目描述】

给定一个正整数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

【分析】

具体的操作方法是。两个数组a,b,a[i]就是k ^ i,b[i]就是我们构造的序列。

两个指针p1,p2分别对应a,b。

初始化p2 = 0,p1 = 1。

对于当前构造的b[i]来说分两种情况。

  1. a[p1]≠b[p2]: b[i] = a[p1] + b[p2++]
  2. a[p1] == b[p2]: b[i] = a[++p1]; p2 = 1

然后输出b[n]即可。

 

#include <stdio.h>
#define MAXN 2000
int a[MAXN],b[MAXN];
int k,n,p1,p2;
int main() {
  scanf("%d%d",&k,&n);
  a[1] = 1;
  p1 = 1;
  for (int i = 1;i <= n;++i)
    if (b[p2] == a[p1]) {
      ++p1;
      a[p1] = a[p1 - 1] * k;
      b[i] = a[p1];
      p2 = 1;
    } else {
        b[i] = a[p1] + b[p2++];
      }
  printf("%d\n",b[n]);
  return 0;
}

posted @ 2010-10-14 18:06  Sephiroth.L.  阅读(254)  评论(0编辑  收藏  举报