记录编号 |
571237 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[金陵中学2007] 最优分解方案 |
最终得分 |
100 |
用户昵称 |
yrtiop |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.460 s |
提交时间 |
2022-05-18 20:06:47 |
内存使用 |
2.50 MiB |
显示代码纯文本
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 1e3 + 5;
- typedef unsigned long long ull;
- struct bigint {
- int g[100],len;
- bigint() {
- memset(g , 0 , sizeof(g));
- len = 1;
- }
- void print() {
- for(;len > 1&&!g[len];-- len);
- for(int i = len;i;-- i)printf("%d",g[i]);
- return ;
- }
- bigint operator = (int p) {
- len = 0;
- if(!p) {
- g[len = 1] = 0;
- return *this;
- }
- for(;p;p /= 10)g[++ len] = p % 10;
- return *this;
- }
- bool operator < (const bigint& p)const {
- if(len ^ p.len)return len < p.len;
- for(int i = len;i >= 1;-- i)
- if(g[i] ^ p.g[i])return g[i] < p.g[i];
- return false;
- }
- bool operator > (bigint p) {
- if(len ^ p.len)return len > p.len;
- for(int i = len;i;-- i)
- if(g[i] ^ p.g[i])return g[i] > p.g[i];
- return false;
- }
- friend bigint operator * (bigint a,int b) {
- bigint c;
- c.len = a.len;
- for(int i = 1;i <= c.len;++ i)c.g[i] = a.g[i] * b;
- for(int i = 1;i <= c.len;++ i)c.g[i + 1] += c.g[i] / 10,c.g[i] %= 10;
- 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;
- return c;
- }
- };
- bigint f[maxn];
- bitset<maxn> s[maxn];
- int n;
- int main() {
- freopen("best.in","r",stdin);
- freopen("best.out","w",stdout);
- scanf("%d",&n);
- f[0] = 1;
- for(int i = 1;i <= n;++ i) {
- int id = 0;
- for(int j = 1;j <= i;++ j) {
- if(s[i - j].test(j))continue ;
- if(f[i - id] * id < f[i - j] * j)id = j;
- }
- if(!id)continue ;
- f[i] = f[i - id] * id;
- s[i] = s[i - id];
- s[i].set(id , 1);
- }
- f[n].print();
- return 0;
- }