結果

問題 No.2358 xy+yz+zx=N
ユーザー 👑 ygussanyygussany
提出日時 2023-06-04 19:25:28
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 31 ms / 2,000 ms
コード長 1,716 bytes
コンパイル時間 1,030 ms
コンパイル使用メモリ 30,700 KB
実行使用メモリ 4,428 KB
最終ジャッジ日時 2023-09-14 10:01:07
合計ジャッジ時間 2,312 ms
ジャッジサーバーID
(参考情報)
judge14 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 1 ms
4,376 KB
testcase_03 AC 1 ms
4,376 KB
testcase_04 AC 1 ms
4,376 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 AC 1 ms
4,376 KB
testcase_07 AC 1 ms
4,380 KB
testcase_08 AC 30 ms
4,380 KB
testcase_09 AC 31 ms
4,428 KB
testcase_10 AC 24 ms
4,376 KB
testcase_11 AC 25 ms
4,376 KB
testcase_12 AC 18 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <stdio.h>

void merge_sort(int n, int x[][3])
{
	static int y[1000001][3] = {};
	if (n <= 1) return;
	merge_sort(n / 2, &(x[0]));
	merge_sort((n + 1) / 2, &(x[n/2]));
	
	int i, p, q;
	for (i = 0, p = 0, q = n / 2; i < n; i++) {
		if (p >= n / 2) {
			y[i][0] = x[q][0];
			y[i][1] = x[q][1];
			y[i][2] = x[q++][2];
		} else if (q >= n) {
			y[i][0] = x[p][0];
			y[i][1] = x[p][1];
			y[i][2] = x[p++][2];
		} else if (x[p][0] < x[q][0] || (x[p][0] == x[q][0] && x[p][1] < x[q][1]) || (x[p][0] == x[q][0] && x[p][1] == x[q][1] && x[p][2] < x[q][2])) {
			y[i][0] = x[p][0];
			y[i][1] = x[p][1];
			y[i][2] = x[p++][2];
		} else {
			y[i][0] = x[q][0];
			y[i][1] = x[q][1];
			y[i][2] = x[q++][2];
		}
	}
	for (i = 0; i < n; i++) {
		x[i][0] = y[i][0];
		x[i][1] = y[i][1];
		x[i][2] = y[i][2];
	}
}

int main()
{
	int N;
	scanf("%d", &N);
	
	int T = 0, x, y, z;
	static int ans[1000001][3];
	for (x = 0; x * x * 3 <= N; x++) {
		for (y = x; x * y * 3 <= N && y * y <= N; y++) {
			if (x + y == 0 || (N - x * y) % (x + y) != 0) continue;
			z = (N - x * y) / (x + y);
			if (z < y) break;
			ans[T][0] = x;
			ans[T][1] = y;
			ans[T++][2] = z;
			if (x != y) {
				ans[T][0] = y;
				ans[T][1] = x;
				ans[T++][2] = z;
			}
			if (y != z) {
				ans[T][0] = x;
				ans[T][1] = z;
				ans[T++][2] = y;
			}
			if (z != x) {
				ans[T][0] = z;
				ans[T][1] = y;
				ans[T++][2] = x;
			}
			if (x != y && y != z) {
				ans[T][0] = y;
				ans[T][1] = z;
				ans[T++][2] = x;
				ans[T][0] = z;
				ans[T][1] = x;
				ans[T++][2] = y;
			}
		}
	}
	merge_sort(T, ans);
	
	int i;
	printf("%d\n", T);
	for (i = 0; i < T; i++) printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
	fflush(stdout);
	return 0;
}
0