hdu 4651 (整数拆分 公式题)

  例如 5可拆分为  :  

         5=1+1+1+1+1

         5=1+1+1+2

         5=1+1+3

         5=1+4

         5=1+2+2

         5=2+3

         5=5    

     共7种 ;



1.  #include <cstdio>  

2.  #include <cstring>  

3.  #include <algorithm>  

4.  #define LL long long  

5.  #define INF 0x7fffffff  

6.  #define MOD 1000000007  

7.  #define M 100005  

8.    

9.  using namespace std;  

10.   

11. int p[M];  

12. LL ans[M];  

13. void presolve()  

14. {  

15.     int c = 0;  

16.     for(int i = 1; ; i++)  

17.     {  

18.         p[c++] = (3*i*i-i)/2;  

19.         p[c++] = (3*i*i+i)/2;  

20.         if((3*i*i-i)/2>M) break;  

21.     }  

22. }  

23. LL solve(int n)  

24. {  

25.     if(ans[n]) return ans[n];  

26.     LL temp = 0;  

27.     for(int i = 0; p[i] <= n; ++i)  

28.     {  

29.         if((i/2)&1) temp -= solve(n-p[i]);  

30.         else temp += solve(n-p[i]);  

31.     }  

32.     if(temp<0) temp+=(-temp/MOD+1)*MOD;  

33.     return ans[n] = temp%MOD;  

34. }  

35. int main ()  

36. {  

37.     int t, n;  

38.     scanf("%d",&t);  

39.     presolve();  

40.     memset(ans,0,sizeof(ans));  

41.     while(t--)  

42.     {  

43.         scanf("%d",&n);  

44.         ans[0] = 1; ans[1] = 1; ans[2] = 2;  

45.         for(int i = 3; i <= n; ++i)  

46.             solve(i);  

47.         printf("%I64d\n",solve(n));  

48.     }  

49.     return 0;  

50. }  

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值