数列I

数列I

题目描述
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
1,3,4,9,10,12,13,…

(该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
输入
只有1行,为2个正整数,用一个空格隔开:k N
(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
输出
计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*10的9次方)。(整数前不要有空格和其他符号)。
样例输入

3 100

样例输出

981

一开始看到这道题目,就想着暴力,枚举,但是子数组太多了,不好枚举。

思路:找规律

a1 = 1
a2 = k
a3 = a1+a2
a4 = k^2
a5 = a1 + a4
a6 = a2 + a4
a7 = a3 + a4
a8 = k^3
a9 = a1 + a8
a10 = a2 + a8
a11 = a3 + a8
a12 = a4 + a8
...
a16 = k^4
a17 = a1 + a16
....

于是…

#include<bits/stdc++.h>
using namespace std;
int a[10001];
int main(){
	int k,n;
	cin>>k>>n;
	int x=1,t=x,cnt=0,flag=0;
	a[1]=1;
	for(int i=1;;i++){
		a[++x]=pow(k,i);
		t=x;						//防止数据x改变(循环结束的条件);
		for(int j=1;j<x;j++){		//从1一直到它前面一个;
			a[++t]=a[j]+pow(k,i);	
			cnt++;					//计数;
			//cout<<a[t]<<" ";
			if(cnt==n){
				flag=1;break;
			}
		}
		x=t;
		if(flag==1) break;
	}
	//for(int i=1;i<=x;i++) cout<<a[i]<<" ";
	cout<<a[n]; 
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值