时间限制: 1 Sec 内存限制: 128 MB
题目描述
小明开始学习二进制转化到十进制,其中要用到2的幂(2的3次幂就是3个2相乘),他觉得这个很有意思。既然通过2的幂相加可以得到十位数,那么反过来,一个十进制数是否可以通过若干个2的幂相加得到呢?
小明开始研究起来,他先列出了所有2的幂:1,2,4,8,16,32,64……。
4=1+1+1+1
4=1+1+2
4=2+2
4=4 4共有4种方法
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7= 1+1+1+2+2
7=1+1+1+4
7=1+2+2+2
7= 1+2+4
共有6种方法。1+2+4和2+1+4认为是同一个等式,因为它们的组成相同。
现在小明想要知道,给出一个十进制数,可以写出多少种,用若干个2的幂数相加的式子。
输入
第一行包含1个正整数n, 1<=n<=1000。
输出
共1行,n能用2的幂数相加的不同式子的种数。
样例输入 Copy
7
样例输出 Copy
6
思维题目,可以进行简单地分类讨论
(1)当n是奇数的时候,因为只是比n-1(偶数)多了一个1,所以f(n)=f(n-1);
(2)当n是偶数的时候:
(i)带1,f(n)=f(n-1);
(ii)不带1,即所有的加数全是偶数,所以,f(n)=f(n/2)。
是不是看起来很简单啊?
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <math.h>
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 1e5+10
using namespace std;
int fun(int n)
{
if(n==1)
return 1;
else
{
if(n%2==1)
return fun(n-1);
else
return fun(n-1)+fun(n/2);
}
}
int main()
{
int n,num=1,i=0;
scanf("%d",&n);
printf("%d",fun(n));
return 0;
}