CF938CConstructing Tests

xiaoxiao2021-02-28  29

// 一个n*n的01矩阵,要求每个m*m的矩阵都至少要有一个0,求最大的1的数量. 现在给定1的数量,构造出一组n,m满足要求 #pragma comment(linker, "/STACK:1024000000,1024000000") #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll inf = 0x3f3f3f3f3f3f3f3f; #define show(a) cout<<#a<<" = "<<a<<endl #define show2(b,c) cout<<#b<<" = "<<b<<" "<<#c<<" = "<<c<<endl #define show3(a,b,c) cout<<#a<<" = "<<a<<" "<<#b<<" = "<<b<<" "<<#c<<" = "<<c<<endl #define show4(a,b,c,d) cout<<#a<<" = "<<a<<" "<<#b<<" = "<<b<<" "<<#c<<" = "<<c<<" "<<#d<<" = "<<d<<endl const int maxn = 100005; #define LOCAL // ll x, t, n, m; int main() { // n^2 - (n/m)^2 = x 平方差公式化简 // (n + (n/ m))(n - (n / m)) = x // x在根号时间内分解成两个数相乘的形式 并由此解出n和n/m cin >> t; while( t-- ) { bool fg = false; cin >> x; if( x == 0 ) cout << "1 1\n"; else if( x == 1 ) cout << "-1\n"; else { for(ll i = 1; i * i <= x; i++) { // if( x%i == 0) show4(i, (i&1), ((x/i)&1), (i + x / i) / 2); // ** if( (x%i==0) && ( (i&1) == ((x/i)&1) ) ) { // (i&1) == ((x/i)&1) : 同是奇数或同是偶数 n = (i + x / i) / 2; ll tmp = n - i; if( tmp == 0) continue; // 分母不为零 m = n / tmp; if( n >= m && tmp == (n/m) ) { cout << n << ' ' << m << endl; fg = 1; break; } } } if( !fg ) cout << "-1\n"; } } } //**平方差定理展开:没有奇数乘以偶数的情况
转载请注明原文地址: https://www.6miu.com/read-2627899.html

最新回复(0)