您的位置:首页 > 其它

hdu 4651 (整数拆分 公式题)

2013-08-07 09:48 387 查看
例如 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
) return ans
;
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
= 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. }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: