链接:https://ac.nowcoder.com/acm/contest/153/1047
来源:牛客网

题目描述 
给定一个正整数k( 3 ≤ k ≤ 15 ),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k = 3时,这个序列是:
1349101213,…(该序列实际上就是:303130+313230+3231+3230+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。例如,对于k = 3,N = 100,正确答案应该是 981。

输入描述:
输入1行,为2个正整数,用一个空格隔开:k N(k、N的含义与上述的问题描述一致,且3 ≤ k ≤ 1510 ≤ N ≤ 1000 )。
输出描述:
输出一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。
示例1
输入

复制
3 100
输出

复制
981

题解code:

 1 #include<stdio.h>
 2 #include <iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 #define ll long long
 6 #define N 1010
 7 ll a[N];
 8 ll quick_pow(ll n, ll k)//快速幂
 9 {
10     ll ans=1;
11     while(k)
12     {
13         if(k%2!=0)
14             ans=ans*n;
15         n=n*n;
16         k/=2;
17     }
18     return ans;
19 }
20 int main()
21 {
22     ll n,k,q,sum,p,i;
23     ll y;
24     while(scanf("%lld %lld",&k,&n)!=EOF)
25     {
26         a[0]=1;
27         a[1]=k;
28         a[2]=k+1;
29         q=2;
30         sum=3;//个数
31         p=3;//项数
32         y=quick_pow(k,q);
33         int flag=0;
34         while(p<=n)
35         {
36             if(p==n)
37             {
38                 flag=1;
39                 break;
40             }
41             a[p++]=y;
42             for(i=0; i<sum; i++)
43             {
44                 a[p++]=y+a[i];
45                 if(p==n)
46                 {
47                     flag=1;
48                     break;
49                 }
50             }
51             if(flag==1)
52                 break;
53             q++;
54             y=quick_pow(k,q);
55             sum+=sum+1;
56         }
57          printf("%lld\n",a[p-1]);
58     }
59     return 0;
60 }