[终于可以自由的写出来了]数列
【题目描述】
给定一个正整数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]来说分两种情况。
- a[p1]≠b[p2]: b[i] = a[p1] + b[p2++]
- 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; }