1. 程式人生 > >noip-2006普及組-數列- 【模擬-找規律-快速冪】

noip-2006普及組-數列- 【模擬-找規律-快速冪】

連結: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 }