[一道好题] [NOIP2006]数列 题解(用c++实现)

发布于:2022-10-21 ⋅ 阅读:(490) ⋅ 点赞:(0)

题目描述:

给定一个正整数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。

输入描述: 输入1行,为2个正整数,用一个空格隔开:k N(k、N的含义与上述的问题描述一致,且3 ≤ k ≤ 15,10 ≤ N ≤ 1000 )。

输出描述:

输出一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。


解题思路:

首先,我们需要找到这个数列的规律。

不妨令k=3,先穷举数列的前几项找规律 ,在推广至一般情况

第n项 元素大小 用3(k)进制表示 用十进制表示
1 30 1 1*30
2 31 10 1* 31 +0 *30
3 31+30 11 1 * 31+1 * 30
4 32 100 1 * 32+0 * 31+0 * 30

总结
这个数列的特点
无论k取何值,所形成的数列用k进制表示都是一致的。
在任何k下都是一致的

在这里插入图片描述

现在给出这个数列的一般规律

第n项 元素大小 用k进制表示 用十进制表示
1 k0 1 1 * k0
2 k1 10 1 * k1+0 * k0
3 k1+k0 11 1 * k1+1 * k0
4 k2 100 1 * k2+0 * k1+0 * k0

现在的问题是:如何知道第n项用k进制表示的结果
即:在已知k的情况下,如果n=5,我们要通过101求出这个元素的值。
但是怎么求出101这个数呢?
相信你已经发现了,101就是5的二进制。
所以,以上的表格可以改为

第n项 元素大小 n的二进制 用十进制表示
1 k0 1 1 * k0
2 k1 10 1 * k1+0 * k0
3 k1+k0 11 1 * k1+1 * k0
4 k2 100 1 * k2+0 * k1+0 * k0

代码

#include<iostream>
#include<cmath>
using namespace std;
int main(){
   int k,n,m;
   long long sum = 0;
   int count = 0;
   cin>>k>>n;
   while(n){
       m = n%2;
       sum +=m*pow(k,count);
       count++;
       n/=2;
   } 
   cout<<sum;
}

解析

大家可能看不懂while循环的内容,这里是解释。

举例说明:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了,大家学会了吗?

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到