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;
}
posted @ 2022-06-11 14:54  A_zjzj  阅读(20)  评论(0编辑  收藏  举报