Skip to content

Instantly share code, notes, and snippets.

@Parcly-Taxel
Created September 27, 2021 15:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Parcly-Taxel/d84d42135507bdc463f7c06429b2d769 to your computer and use it in GitHub Desktop.
Save Parcly-Taxel/d84d42135507bdc463f7c06429b2d769 to your computer and use it in GitHub Desktop.
Pandigital supremacy (PSE #111850)
#!/usr/bin/env python3
from math import comb, factorial as fac
def oS(n, k): # "ordered Stirling numbers" S(n,k) * k!
return sum((-1)**i * comb(k,i) * (k-i)**n for i in range(k+1))
def num_pandig(n):
return 9*oS(n,10)//10
def num_pandig_with_prefix(prefix, f):
r = 10 - len(set(str(prefix)))
return sum(comb(f,k) * oS(k,r) * (10-r)**(f-k) for k in range(r, f+1))
def num_pandig_atmost(n):
sn = str(n)
ndigits = len(sn)
count = sum(num_pandig(k) for k in range(1, ndigits))
for pl in range(1, ndigits+1):
prefix = int(sn[:pl])
for d in range(1, prefix%10 + (pl>1)):
count += num_pandig_with_prefix(prefix-d, ndigits-pl)
return count + (len(set(sn)) == 10)
def non_pandig_abundance(n):
return n - 2*num_pandig_atmost(n)
for d in range(1, 11):
print(f"{d}*10^26", non_pandig_abundance(d*10**26)) # 2
for d in range(21, 31):
print(f"{d}*10^25", non_pandig_abundance(d*10**25)) # 4
for d in range(241, 251):
print(f"{d}*10^24", non_pandig_abundance(d*10**24)) # 5
for d in range(2451, 2461):
print(f"{d}*10^23", non_pandig_abundance(d*10**23)) # 8
for d in range(24581, 24591):
print(f"{d}*10^22", non_pandig_abundance(d*10**22)) # 3
for d in range(245831, 245841):
print(f"{d}*10^21", non_pandig_abundance(d*10**21)) # 6
for d in range(2458361, 2458371):
print(f"{d}*10^20", non_pandig_abundance(d*10**20)) # 7
for d in range(24583671, 24583681):
print(f"{d}*10^19", non_pandig_abundance(d*10**19)) # 2
for d in range(245836721, 245836731):
print(f"{d}*10^18", non_pandig_abundance(d*10**18)) # 7
for d in range(2458367271, 2458367281):
print(f"{d}*10^17", non_pandig_abundance(d*10**17)) # 7
for d in range(24583672771, 24583672781):
print(f"{d}*10^16", non_pandig_abundance(d*10**16)) # 0
for d in range(245836727701, 245836727711):
print(f"{d}*10^15", non_pandig_abundance(d*10**15)) # 7
for d in range(2458367277071, 2458367277081):
print(f"{d}*10^14", non_pandig_abundance(d*10**14)) # 1
for d in range(24583672770711, 24583672770721):
print(f"{d}*10^13", non_pandig_abundance(d*10**13)) # 6
for d in range(245836727707161, 245836727707171):
print(f"{d}*10^12", non_pandig_abundance(d*10**12)) # 4
for d in range(2458367277071641, 2458367277071651):
print(f"{d}*10^11", non_pandig_abundance(d*10**11)) # 1
for d in range(24583672770716411, 24583672770716421):
print(f"{d}*10^10", non_pandig_abundance(d*10**10)) # 3
for d in range(245836727707164131, 245836727707164141):
print(f"{d}*10^9", non_pandig_abundance(d*10**9)) # 9
print()
N = 245836727707164139860503406
for k in range(N-5, N+6):
print(k, non_pandig_abundance(k))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment