結果
問題 | No.1529 Constant Lcm |
ユーザー | bal4u |
提出日時 | 2021-08-15 07:51:14 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 338 ms / 3,000 ms |
コード長 | 1,617 bytes |
コンパイル時間 | 315 ms |
コンパイル使用メモリ | 31,360 KB |
実行使用メモリ | 73,088 KB |
最終ジャッジ日時 | 2024-10-06 20:12:52 |
合計ジャッジ時間 | 4,485 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 1 ms
5,248 KB |
testcase_03 | AC | 1 ms
5,248 KB |
testcase_04 | AC | 1 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 1 ms
5,248 KB |
testcase_07 | AC | 1 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 1 ms
5,248 KB |
testcase_10 | AC | 296 ms
66,816 KB |
testcase_11 | AC | 77 ms
27,776 KB |
testcase_12 | AC | 3 ms
5,248 KB |
testcase_13 | AC | 244 ms
57,728 KB |
testcase_14 | AC | 130 ms
38,016 KB |
testcase_15 | AC | 146 ms
40,064 KB |
testcase_16 | AC | 99 ms
31,488 KB |
testcase_17 | AC | 35 ms
18,048 KB |
testcase_18 | AC | 46 ms
19,328 KB |
testcase_19 | AC | 138 ms
38,912 KB |
testcase_20 | AC | 330 ms
72,960 KB |
testcase_21 | AC | 323 ms
73,088 KB |
testcase_22 | AC | 328 ms
73,088 KB |
testcase_23 | AC | 333 ms
72,960 KB |
testcase_24 | AC | 338 ms
72,960 KB |
testcase_25 | AC | 324 ms
72,960 KB |
ソースコード
// yuki 1529 Constant Lcm // 2021.8.15 #include <stdio.h> typedef long long ll; const int mod = 998244353; #define MAX 1000005 int a[MAX]; char cn[MAX]; int f[MAX][8], p[MAX][8], hi[MAX]; ll ans = 1; void mktbl(int ma) { int i, j, k, m; for (j = 2; j <= ma; j+=2) { i = j, k = 0; while (!(i & 1)) k++, i >>= 1; f[j][hi[j]] = 2, p[j][hi[j]++] = k; } for (m = 3; m <= ma; m += 2) if (!cn[m]) { f[m][hi[m]] = m, p[m][hi[m]++] = 1; for (j = m << 1; j <= ma; j += m) { cn[j] = 1; i = j, k = 0; while (i % m == 0) i /= m, k++; f[j][hi[j]] = m, p[j][hi[j]++] = k; } } } int pow_mod(int x, int p) { int r = 1; while (p) { if (p & 1) r = (ll)r * x % mod; x = (ll)x * x % mod; p >>= 1; } return r; } inline static void mul_pow(int a) { ans = ans * a % mod; } inline static void chmax(int *a, int b) { if (*a < b) *a = b; } void reg(int x, int y) { int i = 0, j = 0; while (i < hi[x] && j < hi[y]) { if (f[x][i] < f[y][j]) chmax(a+f[x][i], p[x][i]), ++i; else if (f[x][i] > f[y][j]) chmax(a+f[y][j], p[y][j]), ++j; else chmax(a+f[x][i], p[x][i]+p[y][j]), ++i, ++j; } while (i < hi[x]) chmax(a+f[x][i], p[x][i]), ++i; while (j < hi[y]) chmax(a+f[y][j], p[y][j]), ++j; } int main() { int N, i, j; scanf("%d", &N); mktbl(N-1); /* for (i = 2; i <= 40; ++i) { printf("[%d] sz=%d: ", i, hi[i]); for (j = 0; j < hi[i]; ++j) printf("(%d,%d) ", f[i][j],p[i][j]); printf("\n"); } */ for (i = 1, j = N-1; i <= j; ++i, --j) reg(i, j); if (a[2]) mul_pow(pow_mod(2, a[2])); for (i = 3; i < N; i+=2) if (a[i]) mul_pow(pow_mod(i, a[i])); printf("%d\n", (int)ans); return 0; }