链接:https://ac.nowcoder.com/acm/contest/153/1047 来源:牛客网 题目描述 给定一个正整数k( 3 ≤ k ≤ 15 ),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k = 3时,这个序列是: 1,3,4,9,10,12,13,…(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…) 请你求出这个序列的第N项的值(用10进制数表示)。例如,对于k = 3,N = 100,正确答案应该是 981。 输入描述: 输入1行,为2个正整数,用一个空格隔开:k N(k、N的含义与上述的问题描述一致,且3 ≤ k ≤ 15,10 ≤ 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 }
浙公网安备 33010602011771号