1206_半数集(1)

Description

一个自然数 n 的一个半数展开是指自然数序列 { a1, a2, …, ak-1, ak }, 其中 ak = n, 2*ai ≤ ai+1, i = 1, 2, …, k-1. 如: n = 24, 那么 { 1, 3, 6, 12, 24 } 和 { 1, 2, 24 } 都是 24 的一个半数展开. 将 n 的一个半数展开序列由后往前取第 i(i=1 ,…, k-1) 项到第 k 项头尾连结将得到一个新的序列, 称之为 n 的一个半数添加序列. 如由 24 的半数展开序列 { 1, 2, 24 } 可以生成相应的半数添加序列 { 1224, 224 }. 由 { 1, 3, 6, 12, 24 } 生成的半数添加序列为 { 1361224, 361224, 61224, 1224 }.

将 n 以及 n 的所有半数添加序列合并起来将得到一个多重集, 称之为 n 的半数集, 记为 halfset(n).

本题对于任意给定的自然数 n, 请计算其半数集 halfset(n) 的元素个数.

Input

有多个测试用例. 每个测试用例由一个自然数 n(n < 1000) 组成. 输入直至没有数据为止.

Output

对于每个测试用例输出一行包含一个整数, 此整数表示 halfset(n) 的元素个数.

Sample Input

6

Sample Output

6

分析

1 {1} 0
2 {1,2} {12} 1
3 {1,3} {13} 1
4 {1,2,4} {1,4} {124,24,14} 3=0+1+1+1=dp[(i/2)]+1+dp[(i/2)-1]+1+…+dp[1]+1
5 {1,2,5} {1,5} {125,25,15}
6 {1,2,6} {1,3,6} {1,6}
6=

参考

代码

#include<iostream>
using namespace std;
int dp[1001];
int main() {
    dp[1] = 0;
    dp[2] = 1;
    dp[3] = 1;
    for (int i = 4; i < 1000;++i) {
        for (int j = i / 2; j >= 1;--j) {
            dp[i] += dp[j] + 1;
        }
    }
    int n;
    while(cin>>n) {
        cout << (dp[n]+1) << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值