2021寒假每日一题《数列》

数列

题目来源:NOIP2006普及组
时间限制:\(1000ms\) 内存限制:\(64mb\)

题目描述

给定一个正整数 \(k\) ,把所有 \(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行,为 \(k\)\(N\) 两个正整数,用一个空格隔开。

输出格式

输出一个正整数为计算结果(在所有的测试数据中,结果均不超过 \(2.1∗10^9\) )。
(整数前不要有空格和其他符号)。

数据范围

\(3 ≤ k ≤ 15\) ,
\(10 ≤ N ≤ 1000\)

样例输入

3 100

样例输出

981

解题思路

继续延长题目给出的串为 \(3^3,3^0+3^3,3^1+3^3,3^0+3^1+3^3,3^2+3^3,3^0+3^2+3^3,3^1+3^2+3^3,3^0+3^1+3^2+3^3,…\)
即: \(3,03,13,013,23,023,123,0123,…\)
规律并不是按多项式的项数来排列的,所以无法用排列数算出具体的项数。

第一个思路:

3的次方上面观察规律,即对 \(0,1,01,2,02,12,012,…\) 观察。
因为每一个次方的数在一项中仅出现一次,用二进制从右往左看,第几位有则第几位为1,其它位为0,比如第一项是 \(0\),看成二进制从右往左第0位为1,即二进制的 \(1\) ;第二项是 \(1\) ,看成二进制从右往左第1位为1,即二进制的 \(10\)
所以上面的串可以转换为 \(1,10,11,100,101,110,111,…\)
然后发现这段就是二进制的 \(1,2,3,4,5,6,7,…\)
所以第100项为:\(1100100\),即 \(2,5,6\) ,所以答案为 \(3^2+3^5+3^6=981\)

第二个思路:

观察数列 \(1,3,4,9,10,12,13,…\) 发现:
其用三进制的表示为 \(1,10,11,100,101,110,111,…\)
然后发现这段就是二进制的 \(1,2,3,4,5,6,7,…\)
由此得到题解,将输入的 \(N\) 用二进制的形式表示出来,然后再将其用 \(k\) 进制展开转换为10进制。

解题代码-Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int k = input.nextInt();
        String n = Integer.toBinaryString(input.nextInt());
        input.close();

        int j = n.length() - 1;
        int ans = 0;
        for (char ch : n.toCharArray()) {
            if (ch == '1') {
                ans += Math.pow(k, j);
            }
            j--;
        }
        System.out.println(ans);
    }
}
posted @ 2021-02-06 00:55  胡人天  阅读(179)  评论(0编辑  收藏  举报