CF938C 【Constructing Tests】题解--zhengjun
一道简单的思维题
我们先按照题目中所说:
给定两个正整数 \(n,m(m\le n)\),对于一个 \(n\) 阶 \(0-1\) 方阵, 其任意 \(m\) 阶子方阵中至少有一个元素 “\(0\)”,则可以求解这个方阵中的 “\(1\)” 的最大数目。
那么显然,每一个 \(0\) 都填在 \((x\times m,y\times m)\) 位置最优。
这样一共就填了:
\(n^2-\lfloor\frac{n}{m}\rfloor^2 =(n+\lfloor\frac{n}{m}\rfloor)(n-\lfloor\frac{n}{m}\rfloor)\)
那么,现在他告诉了我们这个值,让我们去推 \(n,m\)。
那就枚举两个数相乘是 \(x\) ,判断是否有解就可以了(还要看看拆分的这两个数奇偶性是否相同)
#include<cstdio>
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;
}