我可以在不循环 x 和 y 的每个值的情况下解这个方程吗?

问题描述 投票:0回答:1

给定 2 个正整数 c 和 n,找到满足以下方程的 x 和 y 的任意 2 个正整数答案:√x + √y = √z,其中 z = c²n。

输入

输入的第一行包含一个整数

t
(1≤t≤105),即测试用例的数量。每个测试用例的第一行也是唯一一行由 2 个空格分隔的整数
c
n
(4≤c²n≤1018, 2≤c≤109, 1≤n≤109 )

输出

对于每个测试用例,输出 2 个空格分隔的正整数

x
y
,即方程的答案。

如果有多个答案,请打印其中一个。

我尝试让y = n,然后通过二次分析计算x:

√x + √y = c*√n
=> x + 2√y√x + y = c²n
=> x + 2√y√x + y - c²n =0

然后,我通过二次分析计算出x:

=> x = (-b + √(b² - 4ac))/2a

注意:这个问题的时间限制是 1.3 秒,这意味着在最坏的情况下我不应该使用超过 10^10 或 10^11 步。

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int t, n , c;
    double x, num1, num2;

    cin >> t;

    for(int i=0; i<t; i++)
    {
        cin >> c >> n;

        num1 = (double)n - (pow(c, 2)*n);
        num2 = (double) ((-2*sqrt(n))+sqrt((4*n)-(4*num1)))/2;

        cout << (double)pow(num2 , 2) << ' ' << n;
    }
}
c++
1个回答
0
投票
#include <iostream>
#include <cmath>

void solve_test_case() {
    long long c, n;
    std::cin >> c >> n;
    
    // Strategy: Let's make √x = c√n - 1 and √y = 1
    // This means x = (c√n - 1)² and y = 1
    
    // Calculate c√n
    double csqrtn = c * sqrt(n);
    
    // x will be (c√n - 1)²
    long long x = (long long)(csqrtn - 1) * (long long)(csqrtn - 1);
    long long y = 1;
    
    std::cout << x << " " << y << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t;
    std::cin >> t;
    while (t--) {
        solve_test_case();z
    }
    return 0;
} 
© www.soinside.com 2019 - 2024. All rights reserved.