2
2
from sympy import primerange
3
3
import sys
4
4
5
- def main (P : int , N : int , T : int ):
5
+ def main (P : int , N : int , T : int , simple_check : bool = False ):
6
6
primes = list (primerange (2 , P + 1 ))
7
+ budget = {p : 0 for p in primes }
7
8
8
9
divided_factors = []
9
10
for i in range (1 , N + 1 ):
@@ -12,6 +13,7 @@ def main(P: int, N: int, T: int):
12
13
for p in primes :
13
14
while (t % p ) == 0 :
14
15
t //= p
16
+ budget [p ] += 1
15
17
divided_factors .append (t )
16
18
17
19
divided_factors .sort ()
@@ -30,22 +32,32 @@ def main(P: int, N: int, T: int):
30
32
multiply_factors = []
31
33
for line in sys .stdin :
32
34
variable , value = line .split ()
33
- value = int (value )
34
35
assert variable .startswith ("a" )
35
36
n = int (variable [1 :])
37
+ value = int (value )
36
38
t = n
37
39
for p in primes :
38
40
while (t % p ) == 0 :
39
41
t //= p
42
+ budget [p ] -= value
40
43
assert t == 1 , f"Variable { variable } which corresponds to n={ n } was not { P } -smooth!"
41
44
for i in range (value ):
42
45
multiply_factors .append (n )
43
46
47
+ # Check prime budgets
48
+ for p in primes :
49
+ assert budget [p ] >= 0 , "Prime budget exhausted for prime {p}."
50
+
44
51
assert len (divided_factors ) == len (multiply_factors ), f"Unexpected number of factors."
45
52
factors = [divided_factor * multiply_factor for divided_factor , multiply_factor in zip (divided_factors , multiply_factors )]
46
- print (N , N , T )
47
53
for factor in factors :
48
- print (factor )
54
+ assert factor >= T , f"The resulting factor { factor } should have been at least { T } ."
55
+ if simple_check :
56
+ print (N , N , T )
57
+ for factor in factors :
58
+ print (factor )
59
+ else :
60
+ print (P , N , T )
49
61
50
62
if __name__ == '__main__' :
51
63
import argparse
@@ -56,11 +68,12 @@ def main(P: int, N: int, T: int):
56
68
parser .add_argument ('P' , type = int )
57
69
parser .add_argument ('N' , type = int )
58
70
parser .add_argument ('T' , type = int , nargs = '?' , default = 0 )
71
+ parser .add_argument ('--simple_check' , action = 'store_true' , help = 'Output file for simple_check.py to check.' )
59
72
60
73
args = parser .parse_args ()
61
74
62
75
P = args .P
63
76
N = args .N
64
77
T = args .T or math .ceil (N / 4 )
65
78
66
- main (P , N , T )
79
+ main (P , N , T , args . simple_check )
0 commit comments