結果
| 問題 | No.14 最小公倍数ソート |
| コンテスト | |
| ユーザー |
FF256grhy
|
| 提出日時 | 2015-06-04 18:15:36 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 879 ms / 5,000 ms |
| コード長 | 1,541 bytes |
| コンパイル時間 | 181 ms |
| コンパイル使用メモリ | 24,320 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-06 14:07:37 |
| 合計ジャッジ時間 | 11,485 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:12:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
12 | scanf("%d %d", &n, &pre);
| ~~~~~^~~~~~~~~~~~~~~~~~~
main.cpp:18:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
18 | scanf("%d", &temp);
| ~~~~~^~~~~~~~~~~~~
ソースコード
#include <stdio.h>
#define MAX 10000
int gcd(int, int);
int lcm(int, int);
int n, pre, bucket[MAX + 1];
int div_num[MAX + 1], div_table[MAX + 1][64]; // 約数は最大でも64個(7560, 9240のとき)
int main(void) {
scanf("%d %d", &n, &pre);
printf("%d ", pre);
int i, j;
for(i = 1; i < n; i++) { // 最初の1個以外は順番関係ない
int temp;
scanf("%d", &temp);
bucket[temp]++;
}
for(i = 1; i <= MAX; i++) { if(bucket[i]) { // 約数の一覧表を作る
int m = i;
while(m <= MAX) {
div_table[m][ div_num[m] ] = i;
div_num[m]++;
m += i;
}
} }
i = 1;
while(i < n) {
if(div_num[pre]) { // preの約数が残ってれば、その中で一番小さいやつ
j = 0;
while(bucket[ div_table[pre][j] ] == 0) { j++; }
pre = div_table[pre][j];
} else {
int min = MAX * MAX, p = -1;
for(j = 1; j <= MAX; j++) {
if(bucket[j] && div_num[j] == 1) { // 自身以外にも約数が残ってるやつは見なくていい
int l = lcm(pre, j);
if(l < min) { min = l; p = j; }
}
}
pre = p;
}
printf("%d ", pre);
i++;
bucket[pre]--;
if(bucket[pre] == 0) { // preが0個になっていたら、preの倍数の「残りの約数の個数」を更新
int m = pre;
while(m <= MAX) {
div_num[m]--;
m += pre;
}
}
}
printf("\n");
return 0;
}
int gcd(int x, int y) {
int max = (y < x) ? x : y;
int min = (x < y) ? x : y;
if(min == 0) { return max; }
return gcd(min, max % min);
}
int lcm(int x, int y) {
return x * y / gcd(x, y);
}
FF256grhy