数列I
题目描述
给定一个正整数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
一开始看到这道题目,就想着暴力,枚举,但是子数组太多了,不好枚举。
思路:找规律
a1 = 1
a2 = k
a3 = a1+a2
a4 = k^2
a5 = a1 + a4
a6 = a2 + a4
a7 = a3 + a4
a8 = k^3
a9 = a1 + a8
a10 = a2 + a8
a11 = a3 + a8
a12 = a4 + a8
...
a16 = k^4
a17 = a1 + a16
....
于是…
#include<bits/stdc++.h>
using namespace std;
int a[10001];
int main(){
int k,n;
cin>>k>>n;
int x=1,t=x,cnt=0,flag=0;
a[1]=1;
for(int i=1;;i++){
a[++x]=pow(k,i);
t=x; //防止数据x改变(循环结束的条件);
for(int j=1;j<x;j++){ //从1一直到它前面一个;
a[++t]=a[j]+pow(k,i);
cnt++; //计数;
//cout<<a[t]<<" ";
if(cnt==n){
flag=1;break;
}
}
x=t;
if(flag==1) break;
}
//for(int i=1;i<=x;i++) cout<<a[i]<<" ";
cout<<a[n];
return 0;
}