noip-2006普及組-數列- 【模擬-找規律-快速冪】
阿新 • • 發佈:2018-11-09
連結: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; 27a[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 }