#!/usr/bin/python from operator import mod, sub from random import random as rand, seed def eea(a,b): v1 = [a,1,0] v2 = [b,0,1] while v2[0]<>0: p = v1[0]//v2[0] v2, v1 = map(sub,v1,[p*vi for vi in v2]), v2 return v1 def minv(m,k): v = eea(m,k) if v[1]>=0: return v[1] else: return k+v[1] def euc(ar0, ar1): while ar0>0: rx=ar1%ar0 ar1=ar0 ar0=rx return ar1 class cons: def __init__(self): self.rads=[] self.mxms=[] self.mxm=1 self.invs=[] def ad(self, rad): self.mxms.append(self.mxm) res=self.mxm%rad self.invs.append(minv(res, rad)) self.mxm*=rad self.rads.append(rad) def dec2res(self, inum): lst=[] for rad in self.rads: lst.append(inum%rad) return lst def res2dec(self, ires): lim=len(ires) tot=ires[0] ind=1 while ind=2: gcd=euc(cn.mxm, rad) if gcd==1: cn.ad(rad) dun=1 break if dun==0: self.cns.append(cons()) self.cns[-1].ad(rad) for cn in self.cns: self.mxms.append(self.mxm) self.mxm*=cn.mxm def dec2mix(self,inum): inum%=self.mxm lim=len(self.mxms) lst=[0]*lim ind=lim-1 while ind>=0: mxm=self.mxms[ind] if inum>mxm: dig=inum/mxm inum-=mxm*dig lst[ind]=(dig) ind-=1 ind=lim-1 while ind>=0 and lst[ind]==0: ind-=1 ind+=1 if ind<1: ind=1 return lst[:ind] def dec2res(self, inum): mx=self.dec2mix(inum) return self.mix2res(mx) def mix2dec(self, imx): ind=0 lim=len(imx) tot=0 while ind