题解 CF938C 【Constructing Tests】

一道简单的思维题

我们先按照题目中所说:

给定两个正整数 n , m ( m ≤ n ) n,m(m\le n) n,m(mn),对于一个 n n n 0 − 1 0-1 01 方阵, 其任意 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) n2mn2=(n+mn)(nmn)

那么,现在他告诉了我们这个值,让我们去推 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;
}

你可能感兴趣的:(题解 CF938C 【Constructing Tests】)