CSP - J T2
youyew2007 · · 个人记录
拿到这道题的第一件事,我们发现这个式子可以进行一个变形,变为
这里我们需要有一个知识,当两个正数和一定时,他们的差越小,他们的积越大,所以
当然这里我们需要注意:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long k,e,d,m,n;//别忘了开long long
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> k;
while(k--)
{
cin >> n >> e >> d;
m = n - e * d + 2;
int l = 1,r = m >> 1;//位运算会快一点
bool flag = false;
while(l <= r)//注意这里 l 可以等于 r
{
int mid = (l + r) >> 1;
long long num = mid * (m - mid);//这里算的是n,要开long long
if(num == n)//如果等于 n 直接输出
{
cout << mid << ' ' << m - mid << endl;
flag = true;
break;
}
if(num < n)l = mid + 1;//小了就往中间取
else r = mid - 1;//大了往两边取
}
if(!flag)cout << "NO" << endl;
}
}
当然,我们还可以考虑用数学方法,我们有 应该没人不会吧。
注意:有两个点需要特判,一个是
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll n,d,e;
int t;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while(t--)
{
cin >> n >> d >> e;
ll m = n - e * d + 2,l = m * m - 4 * n;
ll delta = sqrt(l);
if(delta * delta != l)//如果乘起来不是 l 说明delta不是整数,直接输出NO
{
cout << "NO" << endl;
continue;
}
else if(delta < 0)//方程无解
{
cout << "NO" << endl;
continue;
}
else
{
ll p = (m - delta) >> 1,q = (m + delta) >> 1;//求两根,delta 大于 0 ,不用判断呼唤的问题。
cout << p << ' ' << q << endl;
}
}
return 0;
}
对于要不要判断
展开,有
将所有偶数删去,变为
若
若
同时,若
综上:分子恒为偶数。