提出 #73318301


ソースコード 拡げる

#include <stdio.h>

#define MOD 998244353
#define MAXA 10000001
#define MAXN 200005

int min_prime[MAXA];
int max1[MAXA], max2[MAXA], count1[MAXA];
int A[MAXN];

// Precompute smallest prime factor for fast factorization
void sieve() {
    for (int i = 2; i < MAXA; i++) {
        if (min_prime[i] == 0) {
            for (int j = i; j < MAXA; j += i)
                if (min_prime[j] == 0) min_prime[j] = i;
        }
    }
}

long long power(long long base, long long exp) {
    long long res = 1;
    base %= MOD;
    while (exp > 0) {
        if (exp % 2 == 1) res = (res * base) % MOD;
        base = (base * base) % MOD;
        exp /= 2;
    }
    return res;
}

void solve() {
    int N;
    scanf("%d", &N);
    
    // Track which primes were seen to reset arrays efficiently
    int seen_primes[MAXN * 10], sp_ptr = 0;

    for (int i = 0; i < N; i++) {
        scanf("%d", &A[i]);
        int temp = A[i];
        while (temp > 1) {
            int p = min_prime[temp];
            int count = 0;
            while (temp % p == 0) {
                temp /= p;
                count++;
            }
            
            if (max1[p] == 0) seen_primes[sp_ptr++] = p;

            if (count > max1[p]) {
                max2[p] = max1[p];
                max1[p] = count;
                count1[p] = 1;
            } else if (count == max1[p]) {
                count1[p]++;
            } else if (count > max2[p]) {
                max2[p] = count;
            }
        }
    }

    // Calculate Global LCM
    long long total_lcm = 1;
    for (int i = 0; i < sp_ptr; i++) {
        total_lcm = (total_lcm * power(seen_primes[i], max1[seen_primes[i]])) % MOD;
    }

    // Modular Inverse for division (if needed) is tricky because of MOD. 
    // Instead, calculate change for each k.
    for (int i = 0; i < N; i++) {
        long long current_lcm = total_lcm;
        int temp = A[i];
        while (temp > 1) {
            int p = min_prime[temp];
            int count = 0;
            while (temp % p == 0) {
                temp /= p;
                count++;
            }
            // If this element was the unique provider of the max power
            if (count == max1[p] && count1[p] == 1) {
                // Remove p^max1 and multiply by p^max2
                long long inv = power(power(p, max1[p]), MOD - 2);
                current_lcm = (current_lcm * inv) % MOD;
                current_lcm = (current_lcm * power(p, max2[p])) % MOD;
            }
        }
        printf("%lld%c", current_lcm, (i == N - 1 ? '\n' : ' '));
    }

    // Clean up global arrays for next test case
    for (int i = 0; i < sp_ptr; i++) {
        int p = seen_primes[i];
        max1[p] = max2[p] = count1[p] = 0;
    }
}

int main() {
    sieve();
    int T;
    scanf("%d", &T);
    while (T--) solve();
    return 0;
}

提出情報

提出日時
問題 E - Many LCMs
ユーザ karishma_26
言語 C23 (Clang 21.1.0)
得点 475
コード長 2946 Byte
結果 AC
実行時間 334 ms
メモリ 160484 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 475 / 475
結果
AC × 1
AC × 25
セット名 テストケース
Sample 00_sample_01.txt
All 00_sample_01.txt, 01_large_t_01.txt, 01_large_t_02.txt, 01_large_t_03.txt, 02_large_n_01.txt, 02_large_n_02.txt, 02_large_n_03.txt, 03_prime_01.txt, 03_prime_02.txt, 03_prime_03.txt, 03_prime_04.txt, 03_prime_05.txt, 03_prime_06.txt, 04_small_prime_factor_01.txt, 04_small_prime_factor_02.txt, 04_small_prime_factor_03.txt, 04_small_prime_factor_04.txt, 04_small_prime_factor_05.txt, 04_small_prime_factor_06.txt, 05_large_value_01.txt, 05_large_value_02.txt, 05_large_value_03.txt, 05_large_value_04.txt, 05_large_value_05.txt, 05_large_value_06.txt
ケース名 結果 実行時間 メモリ
00_sample_01.txt AC 109 ms 41316 KiB
01_large_t_01.txt AC 329 ms 145320 KiB
01_large_t_02.txt AC 333 ms 145200 KiB
01_large_t_03.txt AC 333 ms 144864 KiB
02_large_n_01.txt AC 316 ms 141692 KiB
02_large_n_02.txt AC 293 ms 122972 KiB
02_large_n_03.txt AC 272 ms 110384 KiB
03_prime_01.txt AC 265 ms 158556 KiB
03_prime_02.txt AC 326 ms 160484 KiB
03_prime_03.txt AC 331 ms 160396 KiB
03_prime_04.txt AC 334 ms 160204 KiB
03_prime_05.txt AC 297 ms 159484 KiB
03_prime_06.txt AC 299 ms 159484 KiB
04_small_prime_factor_01.txt AC 285 ms 41132 KiB
04_small_prime_factor_02.txt AC 192 ms 42332 KiB
04_small_prime_factor_03.txt AC 192 ms 42380 KiB
04_small_prime_factor_04.txt AC 197 ms 42332 KiB
04_small_prime_factor_05.txt AC 245 ms 41596 KiB
04_small_prime_factor_06.txt AC 242 ms 41808 KiB
05_large_value_01.txt AC 254 ms 54564 KiB
05_large_value_02.txt AC 217 ms 78556 KiB
05_large_value_03.txt AC 225 ms 55948 KiB
05_large_value_04.txt AC 270 ms 80584 KiB
05_large_value_05.txt AC 239 ms 55436 KiB
05_large_value_06.txt AC 241 ms 79564 KiB