def check(xs,r)
ts=[[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8]]
zs=ts.map{|p1,p2,p3|
(xs[p1]+xs[p2]+xs[p3])%xs[9]
}
if zs.min==zs.max && zs.min==r then
return 1
else
return 0
end
end
def check2(xs,ps,num)
r=(xs[ps[0]]+xs[ps[1]]+xs[ps[2]])%xs[9]
if num==-1 then
return r
end
if r==num then
return r
end
return -1
end
def dfs(deep,xs,ys,ps,cs,r)
if deep==4 then
r=check2(xs,[0,4,8],-1)
end
if deep==6 then
return 0 if check2(xs,[2,4,6],r)!=r
end
if deep==7 then
return 0 if check2(xs,[0,1,2],r)!=r
end
if deep==10 then
return check(xs,r)
else
res=0
p1=ps[deep]
if ys.size>0 && xs[p1]==0 then
ys.size.times{|i|
next if ys[i]==0
xs[p1]=ys[i]
t=ys[i]
ys[i]=0
if deep==0 && t==1 then
res+=cs[ys.size-1]
else
res+=dfs(deep+1,xs,ys,ps,cs,r)
end
ys[i]=t
xs[p1]=0
}
end
if xs[p1]>0 then
if xs[p1]==1 && deep==0 then
return cs[9]
end
res+=dfs(deep+1,xs,ys,ps,cs,r)
end
return res
end
end
def f(xs)
ys=[]
cs=[1]
ps=[9,0,4,8,2,6,1,3,5,7]
m=1
1.upto(10){|e|
ys<<e if xs.member?(e)==false
m*=e
cs<<m
}
puts dfs(0,xs,ys,ps,cs,-1)
end
while true
xs=gets.split(" ").map{|e| e.to_i}
break if xs[0]==-1
f(xs)
end
ZGVmIGNoZWNrKHhzLHIpCgl0cz1bWzAsMSwyXSxbMyw0LDVdLFs2LDcsOF0sWzAsMyw2XSxbMSw0LDddLFsyLDUsOF1dCgl6cz10cy5tYXB7fHAxLHAyLHAzfAoJCSh4c1twMV0reHNbcDJdK3hzW3AzXSkleHNbOV0KCX0KCWlmIHpzLm1pbj09enMubWF4ICYmIHpzLm1pbj09ciB0aGVuCgkJcmV0dXJuIDEKCWVsc2UKCQlyZXR1cm4gMAoJZW5kCmVuZApkZWYgY2hlY2syKHhzLHBzLG51bSkKCXI9KHhzW3BzWzBdXSt4c1twc1sxXV0reHNbcHNbMl1dKSV4c1s5XQoJaWYgbnVtPT0tMSB0aGVuCgkJcmV0dXJuIHIJCgllbmQKCWlmIHI9PW51bSB0aGVuCgkJcmV0dXJuIHIKCWVuZAoJcmV0dXJuIC0xCmVuZApkZWYgZGZzKGRlZXAseHMseXMscHMsY3MscikKCWlmIGRlZXA9PTQgdGhlbgoJCXI9Y2hlY2syKHhzLFswLDQsOF0sLTEpCgllbmQKCWlmIGRlZXA9PTYgdGhlbgoJCXJldHVybiAwIGlmIGNoZWNrMih4cyxbMiw0LDZdLHIpIT1yCgllbmQKCWlmIGRlZXA9PTcgdGhlbgoJCXJldHVybiAwIGlmIGNoZWNrMih4cyxbMCwxLDJdLHIpIT1yCQoJZW5kCglpZiBkZWVwPT0xMCB0aGVuCgkJCgkJcmV0dXJuIGNoZWNrKHhzLHIpCgllbHNlCgkJcmVzPTAKCQlwMT1wc1tkZWVwXQoJCWlmIHlzLnNpemU+MCAmJiB4c1twMV09PTAgdGhlbgoJCQl5cy5zaXplLnRpbWVze3xpfAoJCQkJbmV4dCBpZiB5c1tpXT09MAoJCQkJeHNbcDFdPXlzW2ldCgkJCQl0PXlzW2ldCgkJCQl5c1tpXT0wCgkJCQlpZiBkZWVwPT0wICYmIHQ9PTEgdGhlbgoJCQkJCXJlcys9Y3NbeXMuc2l6ZS0xXQkKCQkJCWVsc2UKCQkJCQlyZXMrPWRmcyhkZWVwKzEseHMseXMscHMsY3MscikKCQkJCWVuZAoJCQkJeXNbaV09dAoJCQkJeHNbcDFdPTAKCQkJfQoJCWVuZAoJCWlmIHhzW3AxXT4wIHRoZW4KCQkJCgkJCWlmIHhzW3AxXT09MSAmJiBkZWVwPT0wIHRoZW4KCQkJCXJldHVybiBjc1s5XQoJCQllbmQKCQkJcmVzKz1kZnMoZGVlcCsxLHhzLHlzLHBzLGNzLHIpCQoJCWVuZAoJCXJldHVybiByZXMKCWVuZAplbmQKZGVmIGYoeHMpCgl5cz1bXQoJY3M9WzFdCglwcz1bOSwwLDQsOCwyLDYsMSwzLDUsN10KCW09MQoJMS51cHRvKDEwKXt8ZXwKCQl5czw8ZSBpZiB4cy5tZW1iZXI/KGUpPT1mYWxzZQoJCW0qPWUKCQljczw8bQoJfQoJcHV0cyBkZnMoMCx4cyx5cyxwcyxjcywtMSkKZW5kCgp3aGlsZSB0cnVlCgl4cz1nZXRzLnNwbGl0KCIgIikubWFwe3xlfCBlLnRvX2l9CglicmVhayBpZiB4c1swXT09LTEKCWYoeHMpCmVuZA==