在线等,寄。
#include<iostream>
#include<cstdio>
#include<map>
#include<queue>
#include<cstring>
#include<cmath>
//#define int long long
#define F(i,j,n) for(register int i=j;i<=n;++i)
using namespace std;
const int N=3e5+50;
const bool debug=0;
int n;
int a[15][15];
int b[15];
bool CAN[15][N];//第一维是满足第几个状态 第二维是数字 值表示是否满足
signed main(){
// freopen("lock.in","r",stdin);
// freopen("lock.out","w",stdout);
scanf("%d",&n);
F(i,1,n){
F(j,1,5){
scanf("%d",&a[i][j]);
}
}
if(n==1){//每一个都转 或者相邻两个转
cout<<5*9+(5-1)*9;//其实就是 81
}else{//O(稍大常数)
F(i,1,n){//n 个要满足的数 第 1 种转动方式
b[i]=
a[i][1]*10000+a[i][2]*1000+a[i][3]*100+a[i][4]*10+a[i][5];
F(j,0,4){//五个位置
for(register int k=0;k<=9;++k){//十个数码
CAN[i][int(
b[i]+int(pow(10,j)*k)%int(pow(10,j+1))
)]=1;
// cout<<"j"<<int(pow(10,j)*k)%int(pow(10,j+1));
}
}
F(j,0,4){//五个位置 第 2 种转动方式
for(register int k=0;k<=9;++k){//十个数码
CAN[i][int(
b[i]+int(pow(10,j)*k)%int(pow(10,j+1))
+int(pow(10,(j+1)%5)*k)%int(pow(10,(j+2)%5))
)]=1;
// cout<<"j"<<int(pow(10,j)*k)%int(pow(10,j+1));
}
}
}
// F(i,1,n){
// cout<<"hng"<<CAN[i][00115];
// }
// puts("");
register int ans=0;
F(j,0,99999){
bool YES=1;
F(i,1,n){
if(!CAN[i][j]){
YES=0;
}
}
if(YES){
++ans;
// printf(" %d ",j);
}
}
printf("%d",ans-1);//不知道为什么每一组的样例都是大 1
}
// system("pause");
// S 组的 Win7 好烦人啊,还有答辩输入法要切换来切换去
return 0;
}
/*
in
1
0 0 1 1 5
out
81
*/