Advertisement
MrHaas

Checkpoint

Jan 30th, 2012
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.29 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import sys
  3. from math import sqrt
  4. from multiprocessing import Pool
  5.  
  6. def time_function(func):    
  7.     def wrapped_func(*args, **kwargs):
  8.         from time import time
  9.         start = time()
  10.         sys.stderr.write('Function %s started\n' % (func.__name__,))
  11.         res = func(*args, **kwargs)
  12.         sys.stderr.write('Function %s finished in %.6fs\n' % (func.__name__, time() - start))
  13.         return res
  14.     return wrapped_func
  15.  
  16. class Problem(object):
  17.     @time_function        
  18.     def __init__(self, data):
  19.         self.s = int(data[0])
  20.         self.divs = list(self.get_divisors())        
  21.  
  22.     def get_pascal(self, row = 0):
  23.         result = [1]
  24.         for i in range(1, 1 + row/2):
  25.             result.append((result[i-1]*(row + 1 - i))/i)
  26.         return result
  27.        
  28.  
  29.     def lookup_pascal(self, n):
  30.         row = 1
  31.         not_found = True
  32.         if n == 1:
  33.             return 0, 1
  34.         r, c = n, 1
  35.         while not_found:
  36.             row += 1
  37.             res = self.get_pascal(row)
  38.             to_check = res[2:]
  39.             if n in to_check:
  40.                 r, c = row, to_check.index(n)
  41.                 not_found = False
  42.             if to_check and to_check[0] > n:
  43.                 break
  44.         return r - c, c
  45.        
  46.  
  47.     def get_divisors(self):
  48.         for i in range(1, 1 + int(sqrt(self.s))):
  49.             if self.s % i == 0:
  50.                 yield i, self.s/i
  51.  
  52.     @time_function
  53.     def get_solution(self, msg = None):
  54.         m = self.s + 1
  55.         for n, p in self.divs:
  56.             r1, c1 = self.lookup_pascal(n)
  57.             r2, c2 = self.lookup_pascal(p)
  58.             if r1 + c1 + r2 + c2 < m:
  59.                 m = r1 + c1 + r2 + c2
  60.                
  61.         return m
  62.  
  63. @time_function
  64. def main():
  65.     input_file = open('input.txt')
  66.     n = int(input_file.readline().strip())
  67.     results = {}
  68.     pool = Pool()
  69.     for i in range(1, n + 1):
  70.         data = map(int, input_file.readline().strip().split(' '))
  71.         results[i] = pool.apply_async(Problem(data).get_solution)
  72.     pool.close()
  73.     pool.join()
  74.    
  75.     for i in sorted(results):
  76.         print "Case #%d: %s" % (i, str(results[i].get()))    
  77.    
  78. if __name__ == '__main__':
  79.     from doctest import testmod
  80.     print >> sys.stderr, testmod()
  81.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement