您的位置:首页 > 其它

51nod 1383 整数分解为2的幂

2017-05-17 12:35 309 查看
画画,找规律。。。

dp
表示n的划分方法。

当n为奇数的时候,dp
=dp[n-1],n-1每种分解后边都加上一个1就是了。

当n为偶数的时候,dp
=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
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: