• Codeforces 938.C Constructing Tests


    C. Constructing Tests
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Let's denote a m-free matrix as a binary (that is, consisting of only 1's and 0's) matrix such that every square submatrix of size m × m of this matrix contains at least one zero.

    Consider the following problem:

    You are given two integers n and m. You have to construct an m-free square matrix of size n × n such that the number of 1's in this matrix is maximum possible. Print the maximum possible number of 1's in such matrix.

    You don't have to solve this problem. Instead, you have to construct a few tests for it.

    You will be given t numbers x1, x2, ..., xt. For every , find two integers ni and mi (ni ≥ mi) such that the answer for the aforementioned problem is exactly xi if we set n = ni and m = mi.

    Input

    The first line contains one integer t (1 ≤ t ≤ 100) — the number of tests you have to construct.

    Then t lines follow, i-th line containing one integer xi (0 ≤ xi ≤ 109).

    Note that in hacks you have to set t = 1.

    Output

    For each test you have to construct, output two positive numbers ni and mi (1 ≤ mi ≤ ni ≤ 109) such that the maximum number of 1's in a mi-free ni × ni matrix is exactly xi. If there are multiple solutions, you may output any of them; and if this is impossible to construct a test, output a single integer  - 1.

    Example
    input
    Copy
    3
    21
    0
    1
    output
    5 2
    1 1
    -1

    题目大意:一个n*n的01矩阵,要求每个m*m的矩阵都至少要有一个0,求最大的1的数量. 现在给定1的数量,构造出一组n,m满足要求.

    分析:先想一想怎么让1的数量最多?肯定是让一个0在尽可能多的m*m的矩阵的重叠区域里.对于一个n*n的矩阵,每一行最少放n/m个0就能满足要求,每一列最少放n/m个0也能满足要求,那么1的最多数量就是n^2 - (n/m)^2 = x.现在问题就变成一个解方程了.

       这个方式是可以利用平方差公式化简的:(n + (n/ m))(n - (n / m)) = x,x可以表示成两个乘积的形式,那么可以把x在根号时间内分解成两个数相乘的形式.并由此解出n和n/m.m也能解出来. 最后判断一下n是否≥m以及n/m是不是我们要求的那个值即可.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long ll;
    
    ll x,t,n,m;
    
    int main()
    {
        cin >> t;
        while (t--)
        {
            bool flag = false;
            cin >> x;
            if (x == 0)
                cout << 1 << " " << 1 << endl;
            else
                if (x == 1)
                cout << -1 << endl;
            else
            {
                for (ll i = 1; i * i <= x; i++)
                {
                    if ((x % i == 0) && ((i & 1) == ((x / i) & 1)))
                    {
                        n = (i + x / i) / 2;
                        ll temp = n - i;
                        if (temp == 0)
                            continue;
                        m = n / temp;
                        if(n >= m && temp == (n / m))
                        {
                            cout << n << " " << m << endl;
                            flag = 1;
                            break;
                        }
                    }
                }
                if (!flag)
                    cout << -1 << endl;
            }
        }
    
        return 0;
    }
  • 相关阅读:
    对象不支持此属性或方法
    继承多态
    GetType和typeof的区别
    比较高效的表格行背景变色及选定高亮JS
    C#获取存储过程的Return返回值和Output输出参数值
    删除表中重复记录,只保留一行
    实现自定义的ToolTip
    状态管理之Cookie
    Microsoft SQL Server,错误: 5120
    IE/Firefox中全局正则表达式的兼容
  • 原文地址:https://www.cnblogs.com/zbtrs/p/8451890.html
Copyright © 2020-2023  润新知