1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m,a[105][105],b[106][106],ans,sum; 5 void pan(int i,int j) 6 { 7 int su=0; 8 for(int i1=1;i1<=n;i1++) 9 for(int j1=1;j1<=m;j1++) 10 b[i1][j1]=a[i1][j1]; 11 for(int x=1;x<=n-i+1;x++) 12 for(int y=1;y<=m-j+1;y++) 13 if(b[x][y]) 14 { 15 int a1=b[x][y]; 16 for(int x1=x;x1<x+i;x1++) 17 for(int y1=y;y1<y+j;y1++) 18 { 19 b[x1][y1]-=a1; 20 if(b[x1][y1]<0) 21 return; 22 } 23 su+=a1*i*j; 24 } 25 if(su==sum) 26 ans=sum/(i*j); 27 } 28 int main() 29 { 30 scanf("%d%d",&n,&m); 31 for(int i=1;i<=n;i++) 32 for(int j=1;j<=m;j++) 33 { 34 scanf("%d",&a[i][j]); 35 sum+=a[i][j]; 36 } 37 ans=sum; 38 for(int i=n;i;i--) 39 for(int j=m;j;j--) 40 if(sum%(i*j)==0&&sum/(i*j)<ans) 41 pan(i,j); 42 printf("%d\n",ans); 43 return 0; 44 }
题解说是二阶差分 但我是暴力过的。