【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,……
(该序列实际上就是: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。

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

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

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

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

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

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

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

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

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

扫描二维码关注公众号,回复: 8551553 查看本文章

我们从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;
}

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

猜你喜欢

转载自www.cnblogs.com/huixinxinw/p/12184479.html
今日推荐