题意:给一个数字矩阵,?表示不确定的数字,问这个子矩阵是否可能存在于乘法表里
题解:不要再傻傻的求解了,暴力一下因子就过了
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e6+10;
struct node{
int x,y;
int val;
}p[N];
int n,m,len;
int flag;
void judge1()
{
for(int i=1;i<=sqrt(p[0].val*1.0);i++)
{
if(p[0].val%i==0&&((i>=p[0].x&&p[0].val/i>=p[0].y)||(i>=p[0].y&&p[0].val/i>=p[0].x)))
{
flag=1;
return;
}
}
flag=0;
}
void judge2()
{
int x=p[0].x,y=p[0].y,val=p[0].val;
for(int i=1;i<=sqrt(val*1.0);i++)
{
if(val%i==0)
{
int x1=i,y1=val/i;
if(x1>=x&&y1>=y)
{
int j=1;
for(;j<len;j++)
{
if((ll)(x1-x+p[j].x)*(y1-y+p[j].y)!=p[j].val)
{
break;
}
}
if(j==len)
{
flag=1;
return;
}
}
if(x1>=y&&y1>=x)
{
swap(x1,y1);
int j=1;
for(;j<len;j++)
{
if((ll)(x1-x+p[j].x)*(y1-y+p[j].y)!=p[j].val)
{
break;
}
}
if(j==len)
{
flag=1;
return;
}
}
}
}
flag=0;
}
int main()
{
int T;
int nn=1;
char op[2000];
scanf("%d",&T);
while(T--)
{
len=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%s",op);
if(op[0]=='?') continue;
int l=strlen(op),mm=0;
for(int k=0;k<l;k++)
mm=mm*10+op[k]-'0';
p[len].x=i,p[len].y=j,p[len++].val=mm;
}
}
// cout<<len<<endl;
if(len==0) flag=1;
else if(len==1) judge1();
else judge2();
printf("Case #%d: ",nn++);
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}