Submission #73325951


Source Code Expand

class PrimeTools:
    def __init__(self, limit=10**7):
        self.limit = limit
        self._prime_list = None

        # _divisor[value]: value の素因数
        # _divisor[value] == value なら、value は素数となる
        self._divisor = [i for i in range(limit+1)]

        # エラトステネスの篩を行いつつ、_divisor を更新していく
        for i in range(2, int(limit**0.5)+1):
            if self._divisor[i] == i:
                for j in range(i*2, limit+1, i):
                    self._divisor[j] = i
    
    # 素数かどうか
    def is_prime(self, value):
        if value < 2:
            return False
        
        if value > self.limit:
            raise ValueError('Limit Exceeded (value too large)')

        return self._divisor[value] == value

    # limit までの素数リストを返す
    def get_prime_list(self):
        if self._prime_list == None:
            self._prime_list = [i for i in range(2, self.limit+1)
                                if self._divisor[i]==i]
        return self._prime_list

    # 高速素因数分解
    def _fast_prime_factorize(self, value):
        if not 1 <= value <= self.limit:
            raise ValueError('Value out of range for fast factorization', value)

        if value == 1:
            return []
        
        result = []
        while value != 1:
            div = self._divisor[value]
            power = 0
            while value % div == 0:
                power += 1
                value //= div
            result.append((div, power))
        return sorted(result)

    # 素因数分解
    def prime_factorize(self, value):
        if not 1 <= value <= self.limit**2:
            raise ValueError('Value out of range for factorization', value)

        if value <= self.limit:
            return self._fast_prime_factorize(value)

        result = []
        for div in self.get_prime_list():
            if div >= value:
                break
            power = 0
            while value % div == 0:
                power += 1
                value //= div
            if power > 0:
                result.append((div, power))
                if value <= self.limit:
                    return sorted(result + self._fast_prime_factorize(value))

        # 割れずに残った数字は素数
        if value > 1:
            result.append((value, 1))

        return sorted(result)

from collections import defaultdict

def main():
    MOD = 998244353
    T = int(input())
    pt = PrimeTools(10**7)

    for _ in range(T):
        N = int(input())
        A = list(map(int, input().split()))
        d = defaultdict(list)

        for v in A:
            pf = pt.prime_factorize(v)
            for prime, count in pf:
                t = sorted(d[prime] + [count])[-2:]
                d[prime] = t
        lcm = 1
        for prime, counts in d.items():
            lcm = (lcm * pow(prime, counts[-1], MOD)) % MOD

        result = []

        for v in A:
            pf = pt.prime_factorize(v)
            res = lcm
            for prime, count in pf:
                if d[prime][-1] == count:
                    if len(d[prime]) == 1:
                        rc = 0
                    else:
                        rc = d[prime][0]
                    div = pow(prime, (count - rc), MOD)
                    dd = pow(div, MOD-2, MOD)
                    res = (res * dd) % MOD
            result.append(res)

        print(*result)
                    
main()

Submission Info

Submission Time
Task E - Many LCMs
User scrblbug
Language Python (PyPy 3.11-v7.3.20)
Score 475
Code Size 3614 Byte
Status AC
Exec Time 1435 ms
Memory 238864 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 1
AC × 25
Set Name Test Cases
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
Case Name Status Exec Time Memory
00_sample_01.txt AC 300 ms 180124 KiB
01_large_t_01.txt AC 1171 ms 189568 KiB
01_large_t_02.txt AC 1245 ms 189776 KiB
01_large_t_03.txt AC 1277 ms 189420 KiB
02_large_n_01.txt AC 999 ms 215200 KiB
02_large_n_02.txt AC 997 ms 219116 KiB
02_large_n_03.txt AC 1001 ms 224788 KiB
03_prime_01.txt AC 925 ms 189124 KiB
03_prime_02.txt AC 773 ms 236592 KiB
03_prime_03.txt AC 778 ms 236548 KiB
03_prime_04.txt AC 771 ms 237524 KiB
03_prime_05.txt AC 864 ms 209580 KiB
03_prime_06.txt AC 854 ms 209500 KiB
04_small_prime_factor_01.txt AC 1435 ms 189348 KiB
04_small_prime_factor_02.txt AC 909 ms 223356 KiB
04_small_prime_factor_03.txt AC 883 ms 223188 KiB
04_small_prime_factor_04.txt AC 892 ms 222968 KiB
04_small_prime_factor_05.txt AC 1190 ms 203136 KiB
04_small_prime_factor_06.txt AC 1176 ms 203260 KiB
05_large_value_01.txt AC 1278 ms 189740 KiB
05_large_value_02.txt AC 924 ms 189164 KiB
05_large_value_03.txt AC 1046 ms 231420 KiB
05_large_value_04.txt AC 711 ms 238864 KiB
05_large_value_05.txt AC 1170 ms 204444 KiB
05_large_value_06.txt AC 833 ms 208360 KiB