/************************************************************************* > File Name: L.cpp > Author: LyuCheng > Created Time: 2017-12-03 17:31 > Description: 题意:首先有一个乘法表,然后给你一个n*m的矩阵,里面有不确定的数,然 后问你,这个表可不可能是乘法表的一部分 思路:暴力判断每个点 ************************************************************************/ #include <bits/stdc++.h> #define MAXN 1234 #define MAXM 12 #define LL long long using namespace std; struct Point{ int x,y; LL val; Point(){} Point(int _x,int _y,LL _val){ x=_x; y=_y; val=_val; } }; int t; int n,m; LL mapn[MAXN][MAXN]; char str[MAXM]; bool flag; vector<Point>P; inline LL cal(char str[]){ int len=strlen(str); LL s=0; for(int i=0;i<len;i++){ s*=10; s+=str[i]-'0'; } return s; } inline bool judge(LL x,LL y,LL fx,LL fy){ for(int i=1;i<(int)P.size();i++){ if((fx+P[i].x-x)*(fy+P[i].y-y)!=P[i].val) return false; } return true; } inline void init(){ P.clear(); flag=false; } int main(){ // freopen("in.txt","r",stdin); scanf("%d",&t); for(int ca=1;ca<=t;ca++){ printf("Case #%d: ",ca); init(); scanf("%d%d",&n,&m); for(LL i=1;i<=n;i++){ for(LL j=1;j<=m;j++){ scanf("%s",str); if(str[0]!='?'){ mapn[i][j]=cal(str); P.push_back(Point(i,j,mapn[i][j])); }else{ mapn[i][j]=0; } } } if((int)P.size()==0){ puts("Yes"); }else { for(LL i=1;i*i<=P[0].val;i++){ if(P[0].val%i==0){ LL fx=i; LL fy=P[0].val/i; if(fx>=P[0].x&&fy>=P[0].y) if(judge(P[0].x,P[0].y,fx,fy)==true){ flag=true; break; } swap(fx,fy); if(fx>=P[0].x&&fy>=P[0].y) if(judge(P[0].x,P[0].y,fx,fy)==true){ flag=true; break; } } } puts(flag==true?"Yes":"No"); } } return 0; }