#堀江伸一会津大学オンラインジャッジ問33802xL Minesweeper合格
def f()
l0=gets.to_i
xs=gets.chomp.split(" ")
m=998244353
hsL={}
hsC={}
hsR={}
ans=0
2.times{|i|
2.times{|j|
2.times{|k|
2.times{|l|
l2=(i+j+k).to_s
r2=(j+k+l).to_s
t1=[i.to_s,j.to_s,k.to_s]
t2=[j.to_s,k.to_s,l.to_s]
[l2,"?"].each{|l3|
[r2,"?"].each{|r3|
hsC[[l3,r3]]=[] if hsC.member?([l3,r3])==false
hsC[[l3,r3]]<<[t1,t2]
}
}
}
}
}
}
2.times{|i|
2.times{|j|
2.times{|k|
l2=(i+j).to_s
r2=(i+j+k).to_s
t1=[i.to_s,j.to_s]
t2=[i.to_s,j.to_s,k.to_s]
[l2,"?"].each{|l3|
[r2,"?"].each{|r3|
hsL[[l3,r3]]=[] if hsL.member?([l3,r3])==false
hsL[[l3,r3]]<<[t1,t2]
}
}
}
}
}
2.times{|i|
2.times{|j|
2.times{|k|
l2=(i+j+k).to_s
r2=(j+k).to_s
t1=[i.to_s,j.to_s,k.to_s]
t2=[j.to_s,k.to_s]
[l2,"?"].each{|l3|
[r2,"?"].each{|r3|
hsR[[l3,r3]]={} if hsR.member?([l3,r3])==false
hsR[[l3,r3]][t1]=1
}
}
}
}
}
if l0==1 then
e1=xs[0]
if e1=="3" || e1=="2" then
puts 0
elsif e1=="?"
puts 2
else
puts 1
end
elsif l0==2 then
e1=xs[0]
e2=xs[1]
ans=0
if e1=="3" || e2=="3" then
ans=0
elsif e1=="?" && e2=="?" then
ans=4
elsif e1=="?" || e2=="?" then
if e1=="1" || e2=="1" then
ans=2
else
ans=1
end
elsif e1=="1" && e2=="1"
ans=2
elsif e1==e2
ans=1
else
ans=0
end
puts ans
else
e1=xs[0]
e2=xs[1]
rf={}
if hsL.member?([e1,e2])
hsL[[e1,e2]].each{|v1,v2|
rf[v2]=0 if rf.member?(v2)==false
rf[v2]+=1
}
end
xs.shift
last2=xs.last
xs.pop
last1=xs.last
xs.each_cons(2){|e1,e2|
rf2={}
if hsC.member?([e1,e2]) then
hsC[[e1,e2]].each{|v1,v2|
if rf.member?(v1) then
#p [e2,v2]
rf2[v2]=0 if rf2.member?(v2)==false
rf2[v2]=(rf2[v2]+rf[v1])%m
end
}
end
rf=rf2
#p [e1,e2,rf]
}
#p rf
#p hsR.each{|k,v|
# p k
# p v
#}
rf.each{|k,v|
if hsR[[last1,last2]].member?(k) then
ans=(ans+v)%m
end
}
puts ans
end
end
f()
I+WggOaxn+S8uOS4gOS8mua0peWkp+WtpuOCquODs+ODqeOCpOODs+OCuOODo+ODg+OCuOWVjzMzODAyeEwgTWluZXN3ZWVwZXLlkIjmoLwKZGVmIGYoKQpsMD1nZXRzLnRvX2kKeHM9Z2V0cy5jaG9tcC5zcGxpdCgiICIpCm09OTk4MjQ0MzUzCmhzTD17fQpoc0M9e30KaHNSPXt9CmFucz0wCjIudGltZXN7fGl8CgkyLnRpbWVze3xqfAoJCTIudGltZXN7fGt8CgkJCTIudGltZXN7fGx8CgkJCQlsMj0oaStqK2spLnRvX3MKCQkJCXIyPShqK2srbCkudG9fcwoJCQkJdDE9W2kudG9fcyxqLnRvX3Msay50b19zXQoJCQkJdDI9W2oudG9fcyxrLnRvX3MsbC50b19zXQoJCQkJW2wyLCI/Il0uZWFjaHt8bDN8CgkJCQkJW3IyLCI/Il0uZWFjaHt8cjN8CgkJCQkJCWhzQ1tbbDMscjNdXT1bXSBpZiBoc0MubWVtYmVyPyhbbDMscjNdKT09ZmFsc2UKCQkJCQkJaHNDW1tsMyxyM11dPDxbdDEsdDJdCgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9CjIudGltZXN7fGl8CgkyLnRpbWVze3xqfAoJCTIudGltZXN7fGt8CgkJCWwyPShpK2opLnRvX3MKCQkJcjI9KGkraitrKS50b19zCgkJCXQxPVtpLnRvX3Msai50b19zXQoJCQl0Mj1baS50b19zLGoudG9fcyxrLnRvX3NdCgkJCVtsMiwiPyJdLmVhY2h7fGwzfAoJCQkJW3IyLCI/Il0uZWFjaHt8cjN8CgkJCQkJaHNMW1tsMyxyM11dPVtdIGlmIGhzTC5tZW1iZXI/KFtsMyxyM10pPT1mYWxzZQoJCQkJCWhzTFtbbDMscjNdXTw8W3QxLHQyXQoJCQkJfQoJCQl9CgkJfQoJfQp9CjIudGltZXN7fGl8CgkyLnRpbWVze3xqfAoJCTIudGltZXN7fGt8CgkJCWwyPShpK2oraykudG9fcwoJCQlyMj0oaitrKS50b19zCgkJCXQxPVtpLnRvX3Msai50b19zLGsudG9fc10KCQkJdDI9W2oudG9fcyxrLnRvX3NdCgkJCVtsMiwiPyJdLmVhY2h7fGwzfAoJCQkJW3IyLCI/Il0uZWFjaHt8cjN8CgkJCQkJaHNSW1tsMyxyM11dPXt9IGlmIGhzUi5tZW1iZXI/KFtsMyxyM10pPT1mYWxzZQoJCQkJCWhzUltbbDMscjNdXVt0MV09MQoJCQkJfQoJCQl9CgkJfQoJfQp9CgppZiBsMD09MSB0aGVuCgllMT14c1swXQoJaWYgZTE9PSIzIiB8fCBlMT09IjIiIHRoZW4KCQlwdXRzIDAKCWVsc2lmIGUxPT0iPyIKCQlwdXRzIDIKCWVsc2UKCQlwdXRzIDEKCWVuZAplbHNpZiBsMD09MiB0aGVuCgllMT14c1swXQoJZTI9eHNbMV0KCWFucz0wCglpZiBlMT09IjMiIHx8IGUyPT0iMyIgdGhlbgoJCWFucz0wCgllbHNpZiBlMT09Ij8iICYmIGUyPT0iPyIgdGhlbgoJCWFucz00CgllbHNpZiBlMT09Ij8iIHx8IGUyPT0iPyIgdGhlbgoJCWlmIGUxPT0iMSIgfHwgZTI9PSIxIiB0aGVuCgkJCWFucz0yCgkJZWxzZQoJCQlhbnM9MQoJCWVuZAoJZWxzaWYgZTE9PSIxIiAmJiBlMj09IjEiCgkJYW5zPTIKCWVsc2lmIGUxPT1lMgoJCWFucz0xCgllbHNlCgkJYW5zPTAKCWVuZAoJcHV0cyBhbnMKZWxzZQoJZTE9eHNbMF0KCWUyPXhzWzFdCgkKCXJmPXt9CglpZiBoc0wubWVtYmVyPyhbZTEsZTJdKQoJCWhzTFtbZTEsZTJdXS5lYWNoe3x2MSx2MnwKCQkJcmZbdjJdPTAgaWYgcmYubWVtYmVyPyh2Mik9PWZhbHNlCgkJCXJmW3YyXSs9MQoJCX0KCWVuZAoJeHMuc2hpZnQKCWxhc3QyPXhzLmxhc3QKCXhzLnBvcAoJbGFzdDE9eHMubGFzdAoJeHMuZWFjaF9jb25zKDIpe3xlMSxlMnwKCQlyZjI9e30KCQlpZiBoc0MubWVtYmVyPyhbZTEsZTJdKSB0aGVuCgkJCWhzQ1tbZTEsZTJdXS5lYWNoe3x2MSx2MnwKCQkJCWlmIHJmLm1lbWJlcj8odjEpIHRoZW4KCQkJCQkJI3AgW2UyLHYyXQoJCQkJCQlyZjJbdjJdPTAgaWYgcmYyLm1lbWJlcj8odjIpPT1mYWxzZQoJCQkJCQlyZjJbdjJdPShyZjJbdjJdK3JmW3YxXSklbQoJCQkJZW5kCgkJCX0KCQllbmQKCQkKCQkKCQlyZj1yZjIKCQkjcCBbZTEsZTIscmZdCgl9CgkjcCByZgoJI3AgaHNSLmVhY2h7fGssdnwKCSMJcCBrCgkjCXAgdgoJI30KCXJmLmVhY2h7fGssdnwKCQkKCQlpZiBoc1JbW2xhc3QxLGxhc3QyXV0ubWVtYmVyPyhrKSB0aGVuCgkJCWFucz0oYW5zK3YpJW0KCQllbmQKCX0KCQoJcHV0cyBhbnMKZW5kCmVuZAoKZigpCg==