2472: 【例】【普及-】【P1028】数的计算
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:44
解决:30
题目描述
给出自然数 ,要求按如下方式构造数列:
- 只有一个数字 的数列是一个合法的数列。
- 在一个合法的数列的末尾加入一个大于0的自然数,但是这个自然数不能超过该数列最后一项的一半,可以得到一个新的合法数列。
请你求出,一共有多少个合法的数列。两个合法数列 不同当且仅当两数列长度不同或存在一个正整数 ,使得 。
输入
输入只有一行一个整数,表示 。
输出
输出一行一个整数,表示合法的数列个数。
样例输入 复制
6
样例输出 复制
6
提示
样例 1 解释
满足条件的数列为:
数据规模与约定
对于全部的测试点,保证 。
#include<bits/stdc++.h>
using namespace std;
int sol(int x){
if(x==1) return 1;
int ans=1;
for(int i=1;i<=x/2;i++)
ans+=sol(i);
return ans;
}
int n;
int main(){
cin>>n;
cout<<sol(n);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,
f[1010];
int sol(int x) {
int ans = 1;
if (f[x] != -1)
return f[x];
for (int i=1; i<=x/2; i++)
ans += sol(i);
return f[x] = ans;
}
int main() {
cin >> n;
memset(f, -1, sizeof(f));
f[1] = 1;
cout << sol(n) << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
long long f[1005];
int main() {
int n;
cin >> n;
f[1] = 1;
for (int i = 2; i <= n / 2; i++) {
f[i] = 1;
for (int j = 1; j <= i / 2; j++) {
f[i] += f[j];
}
}
f[n] = 1;
for (int i = 1; i <= n / 2; i++) {
f[n] += f[i];
}
cout << f[n];
return 0;
}