【luogu】p1062 数列

【luogu】p1062 数列

题目链接:

https://www.luogu.com.cn/problem/P1062
题目描述
给定一个正整数)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。

输入格式
2个正整数,用一个空格隔开:

k N (k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。

输出格式
1个正整数。(整数前不要有空格和其他符号)。

看到好多题解都是转换进制做的,但我太菜了并不会

啊。这是一道找规律的数学题

我感觉我写的好乱能看懂就尽量看看叭(表达能力十分有限

我们先观察3的方幂的数列

1,3,9,27,81,243……

对于任意一个数,它一定大于前面所有数之和

我们从3的2次方开始看

由于上述规律,我们可以知道3的2次方到3的3次方之间的数字里一定包含3的2次方

又因为3的2次方之前的数都是递增的,且全由3的不同方幂组成

3的2次方之后的第一个数便是3的二次方加上数列的第一个数

第二个数是3的二次方加上数列的第二个数,第三个是加上数列的第三个数……

所以在序列每一个数的组成中

最大数为3的0次方的数有一个

最大数为3的1次方的数有1+1=2个

最大数为3的2次方的数有1+1+2=4个

最大数为3的3次方的数有1+1+2+4=8个

总结规律:最大数为3的n次方的数有2的n次方个

同理对于任意的k而言,数的组成中最大数为k的n次方的数也有2的n次方个

最大数为k的n次方的数在第2的n次方加一到2的n加一次方之间

然后我们就可以根据数的位置求出每一个数是k的哪几次幂组成,累加就是最后答案

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string> 
using namespace std;
int read(){
	int a = 0,f = 0;char p = getchar();
	while(!isdigit(p)){f|=p=='-';p = getchar();}
	while(isdigit(p)){a = (a<<3) + (a<<1) + (p^48);p = getchar();}
	return f?-a:a;
}
int n,k;
long long f[100],m[100];
void _first(){
	f[0] = 1,m[0] = 1;
	for(int i = 1;i <= 10;i++)
		f[i] = f[i-1]*2; 
	//f[i]用来计算这个数由k的哪几次幂组成
	for(int i = 1;i <= 10;i ++ )
		m[i] = m[i-1]*k; 
}
int main(){
	
	k = read();
	n = read();
	_first();
	long long ans = 0;
	//for(int i = 1;i <= 10;i++)cout<<f[i]<<" ";
	for(int i = 10;i >= 0;i--){
		if(n/f[i] >= 1){
			//cout << i <<endl; 
			n %= f[i];
			ans += m[i];
		}
	}
	cout << ans;
}

好的好的好的没了没了别看了(滑稽

posted @ 2020-01-12 19:52  蕙心心w  阅读(218)  评论(0编辑  收藏  举报