画画,找规律。。。
dp[n]表示n的划分方法。
当n为奇数的时候,dp[n]=dp[n-1],n-1每种分解后边都加上一个1就是了。
当n为偶数的时候,dp[n]=dp[n-1]+dp[n/2],n-1的每种分解都加一个1,这是一种情况,因为n是偶数,还有把1合并成2,把2合并成4的情况,这时候多出的这部分分解后的最小单位是2,分解个数最多的就是n/2个2,把这些数字全部都除以2,正好就是n/2的分解情况。
4=1 1 1 1
1 1 2
2 2
4
7=1 1 1 1 1 1 1 –
1 1 1 1 1 2 –
1 1 1 2 2 –
1 1 1 4 –
1 2 2 2 –
1 2 4 –
//后边带–的是7的分解+1的情况
8=1 1 1 1 1 1 1 1 –
1 1 1 1 1 1 2 –
1 1 1 1 2 2 –
1 1 2 2 2 –
1 1 1 1 4 –
1 1 2 4 –
//这里的都除以2是4的分解情况
2 2 2 2
2 2 4
4 4
8
#include <cstdio>
#include <cstring>
const int MAXN = 1e6+1;
const int mod = 1e9+7;
int dp[MAXN];
int main()
{
int n;
scanf("%d",&n);
dp[1] = 1;
dp[2] = 2;
for(int i = 3;i <= n; ++i)
{
if(i&1)
dp[i] = (dp[i-1])%mod;
else
dp[i] = (dp[i-1]+dp[i/2])%mod;
}
printf("%d\n",dp[n]);
return 0;
}