[终于可以自由的写出来了]数列
【题目描述】
给定一个正整数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;
}
浙公网安备 33010602011771号