1 条题解

  • 0
    @ 2026-5-2 12:25:38

    解法

    根据题目列出方程 (x+1)(kx+1)m=0(x+1)(k-x+1)-m=0,化简可得 x2kx+mk1=0x^2-kx+m-k-1=0,得出:

    x1,2=k±k24(mk1)2x_{1,2}=\frac{k\pm\sqrt{k^2-4(m-k-1)}}{2}

    此时,若根号下的值小于零或者两根不为整数就都为无解。

    否则就令

    x1=kk24(mk1)2x_1=\frac{k-\sqrt{k^2-4(m-k-1)}}{2} x2=k+k24(mk1)2x_2=\frac{k+\sqrt{k^2-4(m-k-1)}}{2}

    其中 x1x_1 表示水平切割的次数,x2x_2 表示垂直切割次数,判断两个值是否合法,合法就输出,不合法就先交换再判断。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int t;
    	cin >> t;
    	while (t --) {
    		unsigned long long a,b,k,m,d,x1,x2;
    		cin >> a >> b >> k >> m;
    		d=k*k-4*(m-k-1);
    		if (d < 0 || sqrt(d) != (int)sqrt(d)) {
    			cout << "-1\n";
    			continue;
    		}
    		if ((k-(unsigned long long)sqrt(d))%2 != 0) {
    			cout << "-1\n";
    			continue;
    		} 
    		x1=(k-sqrt(d))/2; x2=(k+sqrt(d))/2;
    		if (x1 < a && x2 < b) cout << x1 << " " << x2 << '\n';
    		else {
    			swap(x1,x2);
    			if (x1 < a && x2 < b) cout << x1 << " " << x2 << '\n';
    			else cout << "-1\n";
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    10298
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者