Description
给定两个正整数 (n,m(m≤n)),对于一个 (n) 阶 (0-1) 方阵, 其任意 (m) 阶子方阵中至少有一个元素 (“0”),则可以求解这个方阵中的 (“1”) 的最大数目。现求解这个问题的逆向问题:已知这个最大数目为 (X),求相应的 (n) 和 (m)。
Solution
设法让每个 (0) 被充分地利用
于是 (n,m,x) 满足关系
[n^2-lfloorfrac n m
floor^2=x
]
令 (t=lfloor n/m floor),则
[(n+t)(n-t)=x
]
枚举 (x) 的所有分解 (x=ab),那么 (x) 可以分解为平方差当且仅当 (a,b) 的奇偶性相同,此时
[n=frac{a+b} 2, t=frac{a-b} 2
]
如果我们找到了这个分解 (n,t),则只需要存在一个 (m) 使得 (t=lfloor n/m floor) 即可,我们只需要假设 (m=n/t) 判断一下是否可行即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,x;
signed main() {
ios::sync_with_stdio(false);
cin>>t;
while(t--) {
cin>>x;
if(x==0) {
cout<<1<<" "<<1<<endl;
}
else if(x==1) {
cout<<-1<<endl;
}
else {
for(int a=1;a*a<x;a++) {
int b=x/a;
if(a*b!=x) continue;
if((a^b)&1) continue;
int n=(a+b)/2,t=(b-a)/2;
int m=n/t;
if(t==n/m) {
cout<<n<<" "<<m<<endl;
goto ok;
}
}
cout<<-1<<endl;
ok:cout<<"";
}
}
}