이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <cstdio>
using namespace std;
//int good[100005][305];
int chk[100005], cur[100005];
int p = 1;
int res[100005], rn;
// table[i][j] : 길이 j로 답이 i인 걸 만들 수 있는가?
void solve (int t) {
if(cur[t] < 0) {
if(chk[-cur[t]] < chk[t+cur[t]]) {
solve(-cur[t]);
solve(t + cur[t]);
}else{
solve(t + cur[t]);
solve(-cur[t]);
}
}else {
for(int i = 0; i < chk[t]; i++) {
res[++rn] = (i < cur[t]) ? p : 293-p;
}
p += cur[t]*p;
}
}
int main() {
for(int i = 1; i <= 100000; i++) chk[i] = (int)1e9;
for(int a = 1; a <= 300; a++) {
for(int b = 1; b <= 300-a; b++) {
// good[a*b][a+b] = a;
if(chk[a*b] > a+b) {
cur[a*b] = a;
chk[a*b] = a+b;
}
}
}
for(int i = 1; i <= 10000; i++) if(chk[i] == (int)1e9) {
for(int j = 1; j < i; j++) {
if(chk[i] > chk[j] + chk[i-j]) {
cur[i] = -j;
(chk[i] = chk[j] + chk[i-j]);
}
}
}
int t; scanf("%d", &t);
solve(t);
printf("%d 293\n", rn);
for(int i = 1; i <= rn; i++) printf("%d ", res[i]);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |