比如N = 7时,共有6种划分方法。
7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4
7
6
思路:
如果一个数是一个奇数,那么他是不是等于前一个数字的组成方式,因为他不可能加上一个最小的2了。
我的意思是,奇数减去前面一个数字,是不是代表着1,不够2,也就是说他的等于前一个数字的组成方式。
而一个数字为偶数,是不是代表着他等于前面一个的组成方式,(因为他前者的组成方式,每一种加上一个1,就是他了。)还要加上谁乘以2就等于他的那个数字的组成方式。(如果不懂你可以写几个就知道了,毕竟我也是写了10个,才知道的规律。)
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll vis[1000005];
ll n;
int main()
{
while(scanf("%lld",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
vis[0]=1;
for(int i=1; i<=n; i++)
{
if(i&1==1) vis[i] = vis[i-1];
else vis[i] = (vis[i/2]+vis[i-1])%1000000007;
}
printf("%lld\n",vis[n]%1000000007);
}
return 0;
}