注册 登录
编程论坛 C++教室

这是一个关于数列的问题,,,听说难倒了很多人,,,,请帮我,谢谢请用c++语言

linkui0801 发布于 2013-01-04 19:10, 907 次点击
题目描述
给定一个正整数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)。
10 回复
#2
yuccn2013-01-04 20:01

是啊,
听说难倒了很多人
#3
rjsp2013-01-05 08:44
听说难倒了很多人
--- 这种话,能同时测出人品和智商
#4
不玩虚的2013-01-05 09:06
表示有人会这个数列的通项公式没?题没看懂。先数学求个通项公式,再写算法。最后编程…
#5
linkui08012013-01-06 23:45
回复 3楼 rjsp
其实我是想要多点人进来帮忙而已,如果有说的不对的地方请原谅
#6
matrix1012013-01-19 09:32
至少看出了RP
#7
zs4106126072013-01-31 16:19
就是递归嘛  自己写函数吧 亲···

#8
peach54602013-02-01 08:18
真的好难哟,飞过...
#9
qgktu2013-02-02 09:45
将n拆成2进制数,例如题目中的100 = 2^6 + 2^5 + 2^2,所以结果是3^6 + 3^5 + 3^2 = 981;
程序不多说了,简单,主要是分析一下规律
#10
qgktu2013-02-02 09:53
k^i > k^i-1 + k^i-2 + ... + k^0;
可以令f(i) = k^i;
其实就是数列的通项可以用 s(0)f(0) + s(1)f(1) + .. + s(i)f(i)来表示
s(0)..s(i)值是0或者1
第n项即是把n转换成2进制,然后二进制对应的位数如果是0,那么数列中对应的位系数是1,其余的是0
#11
fanpengpeng2013-02-02 13:15
表示9楼,10楼的分析很精辟
我来贴个代码
程序代码:
/*****************************
Input:   (k,N)
       | Ctrl+Z to end
Output:  ans
       | "Error!"
       | "Valid!"
       | "Exit."
****************************
*/

#include <iostream>
#include <bitset>

using namespace std;

typedef unsigned long ulong;
typedef unsigned int uint;

ulong An(uint k = 3, uint N = 100);

int main()
{
    uint k = 0, N = 0;
    ulong ans = 0;
   
    while(1){
        cout << "IN: " << flush;
      
        cin.sync();
        cin >> k >> N;
        if(!cin){
            if(cin.eof()){
                cout << "OUT: Exit." << endl;
                return 0;
            }
            else{
                cin.clear();
                cout << "OUT: Error!" << endl;
                continue;   
            }
        }
      
        if(ans = An(k, N)){
            cout << "OUT: " << ans << endl;
        }
        else{
            cout << "OUT: Valid!" << endl;
        }           
    }
   
    return 0;
}

ulong An(uint k, uint N)
{
    if(!((k >= 3 && k <= 15) && (N >= 10 && N <= 1000)))
        return 0;
   
    ulong sum(0), temp(1);   
    bitset<10> coef(N);
   
    for(int i = 0; i < 10; i++){   
            if(coef[i])
                sum += temp;
            temp *= k;
        }
      
    return sum;
}

1