我们先按照题目中所说:
给定两个正整数 n , m ( m ≤ n ) n,m(m\le n) n,m(m≤n),对于一个 n n n 阶 0 − 1 0-1 0−1 方阵, 其任意 m m m 阶子方阵中至少有一个元素 “ 0 0 0”,则可以求解这个方阵中的 “ 1 1 1” 的最大数目。
那么显然,每一个 0 0 0 都填在 ( x × m , y × m ) (x\times m,y\times m) (x×m,y×m) 位置最优。
这样一共就填了:
n 2 − ⌊ n m ⌋ 2 = ( n + ⌊ n m ⌋ ) ( n − ⌊ n m ⌋ ) n^2-\lfloor\frac{n}{m}\rfloor^2 =(n+\lfloor\frac{n}{m}\rfloor)(n-\lfloor\frac{n}{m}\rfloor) n2−⌊mn⌋2=(n+⌊mn⌋)(n−⌊mn⌋)
那么,现在他告诉了我们这个值,让我们去推 n , m n,m n,m。
那就枚举两个数相乘是 x x x ,判断是否有解就可以了(还要看看拆分的这两个数奇偶性是否相同)
#include
using namespace std;
int T,x;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&x);
if(x==0){printf("1 1\n");continue;}//特判
else if(x==1){printf("-1\n");continue;}//特判
bool flag=1;
for(int i=1;i*i<x;i++){
if(x%i!=0)continue;
int a=i,b=x/i;
if((a+b)%2==1)continue;
int aa=(a+b)/2,bb=(b-a)/2,xx=aa/bb;
if(bb==aa/xx){
printf("%d %d\n",aa,xx);
flag=0;
break;
}
}
if(flag)printf("-1\n");
}
return 0;
}