const fi='';
fo='';
maxn=100;
base=1000000000;
type arra=array[1..maxn,1..maxn] of integer;
arrl=array[1..maxn,1..maxn] of longint;
var a:arra;
i,j,m,n:byte;
l:arrl;
f:text;
res:int64;
procedure nhap;
begin
assign(f,fi);
reset(f);
readln(f,m,n);
for i:=1 to m do
for j:=1 to n do read(f,a[i,j]);
close(f);
end;
procedure init;
begin
for i:=1 to m do l[i,1]:=1;
res:=0;
end;
function kt(x,y:longint):boolean;
var tmp:longint;
begin
while y>0 do
begin
x:=x mod y;
tmp:=x;
x:=y;
y:=tmp;
end;
if x=1 then exit(false) else exit(true);
end;
procedure xuly;
var ii,jj:byte;
begin
for i:=1 to m do
for j:=1 to n-1 do
begin
for ii:=i-1 downto 1 do
for jj:=j downto 1 do
if kt(a[i,j],a[ii,jj]) then l[i,j]:=(l[i,j]+l[ii,jj]) mod base;
for jj:=j-1 downto 1 do
if kt(a[i,j],a[i,jj]) then l[i,j]:=(l[i,j]+l[i,jj]) mod base;
end;
for i:=1 to m do
for ii:=i downto 1 do
for jj:=n-1 downto 1 do
if kt(a[i,n],a[ii,jj]) then res:=(res+l[ii,jj]) mod base;
end;
procedure xuat;
begin
assign(f,fo);
rewrite(f);
writeln(f,res);
close(f);
end;
begin
nhap;
init;
xuly;
xuat;
end.
Y29uc3QgICBmaT0nJzsKICAgICAgICBmbz0nJzsKICAgICAgICBtYXhuPTEwMDsKICAgICAgICBiYXNlPTEwMDAwMDAwMDA7CnR5cGUgICAgYXJyYT1hcnJheVsxLi5tYXhuLDEuLm1heG5dIG9mIGludGVnZXI7CiAgICAgICAgYXJybD1hcnJheVsxLi5tYXhuLDEuLm1heG5dIG9mIGxvbmdpbnQ7CnZhciAgICAgYTphcnJhOwogICAgICAgIGksaixtLG46Ynl0ZTsKICAgICAgICBsOmFycmw7CiAgICAgICAgZjp0ZXh0OwogICAgICAgIHJlczppbnQ2NDsKcHJvY2VkdXJlIG5oYXA7CmJlZ2luCiAgICBhc3NpZ24oZixmaSk7CiAgICByZXNldChmKTsKICAgIHJlYWRsbihmLG0sbik7CiAgICBmb3IgaTo9MSB0byBtIGRvCiAgICAgICAgZm9yIGo6PTEgdG8gbiBkbyByZWFkKGYsYVtpLGpdKTsKICAgIGNsb3NlKGYpOwplbmQ7CnByb2NlZHVyZSBpbml0OwpiZWdpbgogICAgZm9yIGk6PTEgdG8gbSBkbyBsW2ksMV06PTE7CiAKICAgIHJlczo9MDsKZW5kOwpmdW5jdGlvbiBrdCh4LHk6bG9uZ2ludCk6Ym9vbGVhbjsKdmFyICAgICB0bXA6bG9uZ2ludDsKYmVnaW4KICAgICAgICB3aGlsZSB5PjAgZG8KICAgICAgICBiZWdpbgogICAgICAgICAgICB4Oj14IG1vZCB5OwogICAgICAgICAgICB0bXA6PXg7CiAgICAgICAgICAgIHg6PXk7CiAgICAgICAgICAgIHk6PXRtcDsKICAgICAgICBlbmQ7CiAgICAgICAgaWYgeD0xIHRoZW4gZXhpdChmYWxzZSkgZWxzZSBleGl0KHRydWUpOwplbmQ7CnByb2NlZHVyZSB4dWx5Owp2YXIgICAgIGlpLGpqOmJ5dGU7CmJlZ2luCiAgICBmb3IgaTo9MSB0byBtIGRvCiAgICAgICAgZm9yIGo6PTEgdG8gbi0xIGRvCiAgICAgICAgYmVnaW4KICAgICAgICAgICAgZm9yIGlpOj1pLTEgZG93bnRvIDEgZG8KICAgICAgICAgICAgICAgIGZvciBqajo9aiBkb3dudG8gMSBkbwogICAgICAgICAgICAgICAgICAgICAgICBpZiBrdChhW2ksal0sYVtpaSxqal0pIHRoZW4gbFtpLGpdOj0obFtpLGpdK2xbaWksampdKSBtb2QgYmFzZTsKICAgICAgICAgICAgZm9yIGpqOj1qLTEgZG93bnRvIDEgZG8KICAgICAgICAgICAgICAgIGlmIGt0KGFbaSxqXSxhW2ksampdKSB0aGVuIGxbaSxqXTo9KGxbaSxqXStsW2ksampdKSBtb2QgYmFzZTsKICAgICAgICBlbmQ7CiAKICAgIGZvciBpOj0xIHRvIG0gZG8KICAgICAgICBmb3IgaWk6PWkgZG93bnRvIDEgZG8KICAgICAgICAgICAgICAgIGZvciBqajo9bi0xIGRvd250byAxIGRvCiAgICAgICAgICAgICAgICBpZiBrdChhW2ksbl0sYVtpaSxqal0pIHRoZW4gcmVzOj0ocmVzK2xbaWksampdKSBtb2QgYmFzZTsKZW5kOwpwcm9jZWR1cmUgeHVhdDsKYmVnaW4KICAgIGFzc2lnbihmLGZvKTsKICAgIHJld3JpdGUoZik7CiAgICB3cml0ZWxuKGYscmVzKTsKICAgIGNsb3NlKGYpOwplbmQ7CmJlZ2luCiAgICBuaGFwOwogICAgaW5pdDsKICAgIHh1bHk7CiAgICB4dWF0OwplbmQu