Submission #12052

#TimeUsernameProblemLanguageResultExecution timeMemory
12052tncks0121배낭 문제 준비하기 (GA9_invknapsack)C++14
5 / 100
36 ms2848 KiB
#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) {
		solve(-cur[t]);
		solve(t + cur[t]);
	}else {
		for(int i = 0; i < chk[t]; i++) {
			res[++rn] = (i < cur[t]) ? p : 293-p;
		}
		p += 3;
	}
}

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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...