Example

Input

0 3 1 7 5 9 8 6 4 2
7 0 9 2 1 5 4 8 6 3
4 2 0 6 8 7 1 3 5 9
1 7 5 0 9 8 3 4 2 6
6 1 2 3 0 4 5 9 7 8
3 6 7 4 2 0 9 5 8 1
5 8 6 9 7 2 0 1 3 4
8 9 4 5 3 6 2 0 1 7
9 4 3 8 6 1 7 2 0 5
2 5 8 1 4 3 6 7 9 0


Output

0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long 
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
const int MAXN=1000005;
int s[7];
int f[7];
int tb[20][20];
bool isok[MAXN];
int cnt=0;
bool ok(){
	int t=0;
	for(int i=0;i<5;i++)
		t=tb[t][s[i]];
	if(!t)
		return true;
	else
		return false;
}
// void dfs(int cur){//已?枚?
// 	if(cur==5){
// 		int t=0;
// 		for(int i=0;i<5;i++){
// 			t*=10;
// 			t+=f[i];
// 			s[i]=f[i];
// 		}
// 		isok[t]=ok();
// 		return;
// 	}
// 	fr(i,0,9){
// 		f[cur]=i;
// 		dfs(cur+1);
// 	}
// }
void dfs2(int cur){
	if(cur==5){
		fr(i,0,4)
			s[i]=f[i];
		//printf("!!!!!!!!!now=%d\n",t);
		fr(i,0,4)
			fr(j,0,9)
				if(j!=s[i]){
					int tt=s[i];
					s[i]=j;
					if(ok()){
						cnt++;
						return;
					}
					s[i]=tt;
				}
		fr(i,0,3){
			if(s[i]!=s[i+1]){
				swap(s[i],s[i+1]);
				if(ok()){
					cnt++;
					return;
				}
				swap(s[i],s[i+1]);
			}
		}
	}
	else if(cur==4){
		int t=0;
		for(int i=0;i<4;i++){
			//printf("making..t=%d\n",t);
			t=tb[t][f[i]];
		}
		//printf("making..t=%d\n",t);
		f[cur]=t;
		dfs2(cur+1);
	}
	else{
		fr(i,0,9){
			f[cur]=i;
			dfs2(cur+1);
		}
	}
}
int main(){
	//ms(isok,false);
	fr(i,0,9)
		fr(j,0,9)
			scfd(&tb[i][j]);
	dfs2(0);
	ptfd(cnt);
	return 0;
}