给定一个正整数 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。
两个由空格隔开的正整数 k,N(3≤k≤15,10≤N≤1000)。
一个正整数。整数前不要有空格和其他符号。
3 100
981
NOIP 2006 普及组 第四题
#include<bits/stdc++.h>
#define re register
#define ull unsigned long long
using namespace std;
int k,n,p;
ull a[1000],f[2000000];
inline int read() {
int k=1;
int sum=0;
char c=getchar();
for(;'0'>c || c>'9';c=getchar())
if(c == '-') k = -1;
for(; '0' <= c && c <= '9'; c = getchar())
sum = sum * 10 + c - '0';
return sum * k;
}
inline void out(int x) {
if(x < 0) { putchar('-'); x *= -1; }
if(x > 9) out(x / 10);
putchar(x % 10 + '0');
}
inline ull quick_pow(int r,int k) {
ull base=r,ans=1;
while(k!=0)
{
if(k&1) ans=ans*base;
base=base*base;
k/=2;
}
return ans;
}
int main(){
k=read();n=read();
a[0]=1;a[1]=k;
for(re int i=2;i<=n;i++) a[i]=quick_pow(k,i);
for(re int i=1;i<=n;i++)
{
f[i]=a[p];p++;
ull tmp=f[i];
int h=i;
if(i>1)
{
for(re int j=1;j<h;j++)
{
f[++i]=tmp+f[j];
if(i>=n)
{
cout<<f[n];
return 0;
}
}
}
}
out(f[n]);
return 0;
}