47 lines
979 B
Python
47 lines
979 B
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
def primes(n):
|
||
|
sieve = [True] * n
|
||
|
for p in range(2, n):
|
||
|
if not sieve[p]:
|
||
|
continue
|
||
|
for i in range(p**2, n, p):
|
||
|
sieve[i] = False
|
||
|
return [False]*2 + sieve[2:]
|
||
|
|
||
|
sieve = primes(10**7)
|
||
|
|
||
|
def is_prime(n):
|
||
|
if n >= 10**7:
|
||
|
return heuristic(n)
|
||
|
return sieve[n]
|
||
|
|
||
|
def heuristic(n):
|
||
|
for i in range(2, int(n**0.5)+1): #slow and lazy
|
||
|
if sieve[i] and n%i==0:
|
||
|
return False
|
||
|
return True
|
||
|
|
||
|
def num(digs = set(range(1,10)), n=0, id=[]):
|
||
|
c = 0
|
||
|
for d in [i for i in digs if i>n]:
|
||
|
c += dig(digs-{d}, d, d, id)
|
||
|
return c
|
||
|
|
||
|
def dig(digs, n, p, id):
|
||
|
c = check(p, digs, n, id)
|
||
|
for d in digs:
|
||
|
c += dig(digs-{d}, n, 10*p + d, id)
|
||
|
return c
|
||
|
|
||
|
def check(p, digs, n, id):
|
||
|
if len(digs) > 0 and max(digs) < n:
|
||
|
return 0
|
||
|
if not is_prime(p):
|
||
|
return 0
|
||
|
if len(digs) == 0:
|
||
|
return 1
|
||
|
return num(digs, n, id)
|
||
|
|
||
|
print(num())
|