【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;
}
好的好的好的没了没了别看了(滑稽