记录编号 571237 评测结果 AAAAAAAAAA
题目名称 [金陵中学2007] 最优分解方案 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.460 s
提交时间 2022-05-18 20:06:47 内存使用 2.50 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e3 + 5;
  4. typedef unsigned long long ull;
  5. struct bigint {
  6. int g[100],len;
  7. bigint() {
  8. memset(g , 0 , sizeof(g));
  9. len = 1;
  10. }
  11. void print() {
  12. for(;len > 1&&!g[len];-- len);
  13. for(int i = len;i;-- i)printf("%d",g[i]);
  14. return ;
  15. }
  16. bigint operator = (int p) {
  17. len = 0;
  18. if(!p) {
  19. g[len = 1] = 0;
  20. return *this;
  21. }
  22. for(;p;p /= 10)g[++ len] = p % 10;
  23. return *this;
  24. }
  25. bool operator < (const bigint& p)const {
  26. if(len ^ p.len)return len < p.len;
  27. for(int i = len;i >= 1;-- i)
  28. if(g[i] ^ p.g[i])return g[i] < p.g[i];
  29. return false;
  30. }
  31. bool operator > (bigint p) {
  32. if(len ^ p.len)return len > p.len;
  33. for(int i = len;i;-- i)
  34. if(g[i] ^ p.g[i])return g[i] > p.g[i];
  35. return false;
  36. }
  37. friend bigint operator * (bigint a,int b) {
  38. bigint c;
  39. c.len = a.len;
  40. for(int i = 1;i <= c.len;++ i)c.g[i] = a.g[i] * b;
  41. for(int i = 1;i <= c.len;++ i)c.g[i + 1] += c.g[i] / 10,c.g[i] %= 10;
  42. for(;c.g[c.len + 1];++ c.len)c.g[c.len + 2] += c.g[c.len + 1] / 10,c.g[c.len + 1] %= 10;
  43. return c;
  44. }
  45. };
  46. bigint f[maxn];
  47. bitset<maxn> s[maxn];
  48. int n;
  49. int main() {
  50. freopen("best.in","r",stdin);
  51. freopen("best.out","w",stdout);
  52. scanf("%d",&n);
  53. f[0] = 1;
  54. for(int i = 1;i <= n;++ i) {
  55. int id = 0;
  56. for(int j = 1;j <= i;++ j) {
  57. if(s[i - j].test(j))continue ;
  58. if(f[i - id] * id < f[i - j] * j)id = j;
  59. }
  60. if(!id)continue ;
  61. f[i] = f[i - id] * id;
  62. s[i] = s[i - id];
  63. s[i].set(id , 1);
  64. }
  65. f[n].print();
  66. return 0;
  67. }