给定 2 个正整数 c 和 n,找到满足以下方程的 x 和 y 的任意 2 个正整数答案:√x + √y = √z,其中 z = c²n。
输入
输入的第一行包含一个整数
(1≤t≤105),即测试用例的数量。每个测试用例的第一行也是唯一一行由 2 个空格分隔的整数t
和c
(4≤c²n≤1018, 2≤c≤109, 1≤n≤109 )n
输出
对于每个测试用例,输出 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;
}
}
#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;
}