zoukankan      html  css  js  c++  java
  • [CF938C] Constructing Tests

    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<<"";
            }
        }
    }
    
  • 相关阅读:
    hdu 1716 排列
    codevs 2597 团伙
    创建了一个静态数组,越界访问为什么不报错
    hdu 2083 简易版之最短距离
    hdu 2073 无限的路
    hdu 2060 Snooker
    hdu 1877
    hdu 1042 N!
    hdu 1799 循环多少次?
    百练:2972 确定进制
  • 原文地址:https://www.cnblogs.com/mollnn/p/12795400.html
Copyright © 2011-2022 走看看