QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#136665 | #235. Maximum Multiple | Team_name# | 100 ✓ | 1421ms | 125896kb | C++20 | 1012b | 2023-08-09 09:51:38 | 2023-08-09 09:51:42 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1e6+5;
constexpr LL INF = 0x3f3f3f3f3f3f3f3f;
vector<int> f[N];
void sieve(int n)
{
for(int i = 1; i <= n; i++) {
for(int j = i; j <= n; j += i)
f[j].push_back(i);
sort(f[i].begin(), f[i].end());
}
}
LL g[N];
LL solve(int n)
{
if(g[n] != INF) return g[n];
const vector<int> &factors = f[n];
LL ans = -1;
for(int i = 0; i < (int)factors.size(); i++) {
for(int j = i; j < (int)factors.size(); j++) {
LL k = n-factors[i]-factors[j];
if(k < factors[j]) break;
if(n%k == 0) ans = max(ans, (LL)factors[i]*(LL)factors[j]*k);
}
}
return g[n] = ans;
}
int main()
{
// freopen("1.in", "r", stdin);
clock_t st_time = clock();
memset(g, 0x3f, sizeof g);
sieve(1e6);
int T; scanf("%d", &T);
while(T--) {
int n; scanf("%d", &n);
printf("%lld\n", solve(n));
}
cerr << "time : " << (clock()-st_time)/CLOCKS_PER_SEC << "s" << endl;
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1421ms
memory: 125896kb
input:
1000000 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 ...
output:
-1 -1 1 2 -1 8 -1 16 27 -1 -1 64 -1 -1 125 128 -1 216 -1 250 343 -1 -1 512 -1 -1 729 686 -1 1000 -1 1024 1331 -1 -1 1728 -1 -1 2197 2000 -1 2744 -1 2662 3375 -1 -1 4096 -1 -1 4913 4394 -1 5832 -1 5488 6859 -1 -1 8000 -1 -1 9261 8192 -1 10648 -1 9826 12167 -1 -1 13824 -1 -1 15625 13718 -1 17576 -1 16...
result:
ok 1000000 lines