码迷,mamicode.com
首页 > 其他好文 > 详细

POJ_2229_Sumsets

时间:2016-04-23 19:37:25      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

描述


http://poj.org/problem?id=2229

将一个数n分解为2的幂之和共有几种分法?

分析


对i讨论:

1.i是奇数:

  分成的序列中必有1,所以可将i分为1+(i-1),所以f[i]=f[i-1];

2.i是偶数:
  (1).分成的序列中有1:

    同奇数,f[i]=f[i-1];

  (2).分成的序列中没有1:

    序列中的所有数都是2的倍数,那么任一种序列中的各个数/2,就得到了i/2的序列,那这种情况下,i的序列数就和i/2的序列数相同即f[i]=f[i/2];

  综上:f[i]=f[i-1]+f[i/2];

技术分享
 1 #include<cstdio>
 2 
 3 const int maxn=1000005,mod=1e9;
 4 int n,f[maxn];
 5 
 6 int main()
 7 {
 8 #ifndef ONLINE_JUDGE
 9     freopen("sum.in","r",stdin);
10     freopen("sum.out","w",stdout);
11 #endif
12     scanf("%d",&n);
13     f[1]=1;
14     for(int i=2;i<=n;i++)
15     {
16         if(i&1) f[i]=f[i-1];
17         else f[i]=(f[i-1]+f[i/2])%mod;
18     }
19     printf("%d\n",f[n]);
20 #ifndef ONLINE_JUDGE
21     fclose(stdin);
22     fclose(stdout);
23 #endif
24     return 0;
25 }
View Code

 

POJ_2229_Sumsets

标签:

原文地址:http://www.cnblogs.com/Sunnie69/p/5425178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!