CSP-J 2022,T2。
这一题我的方法其实是对的,但是浮点误差让我少了 30 分,我就痛失了 CQ 的一等。
我是用的数学方法来做此题。
这是我的 70 分代码:
//the code is from chenjh
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define LLL __int128
int main(){
int k;scanf("%d",&k);
while(k--){
LL n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
LL pq=n-e*d+2;
if((double)pq*pq-4.0*n<0){
puts("NO");
continue;
}
LL pq1=floor(sqrt((double)pq*pq-4.0*n));
if((LLL)pq1*pq1==(LLL)pq*pq-4*n && !((pq+pq1)&1) && pq-pq1>=0 && !((pq-pq1)&1)){
LL ans1=(pq-pq1)>>1,ans2=(pq+pq1)>>1;
if(ans1>ans2) swap(ans1,ans2);
printf("%lld %lld\n",ans1,ans2);
}
else puts("NO");
}
return 0;
}
这是我的 100 分代码:
//the code is from chenjh
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define LLL __int128
int main(){
int k;scanf("%d",&k);
while(k--){
LL n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
LL pq=n-e*d+2;
if(pq*pq-4*n<0){
puts("NO");
continue;
}
LL pq1=floor(sqrt(pq*pq-4*n));
if((LLL)pq1*pq1==(LLL)pq*pq-4*n && !((pq+pq1)&1) && pq-pq1>=0 && !((pq-pq1)&1)){
LL ans1=(pq-pq1)>>1,ans2=(pq+pq1)>>1;
if(ans1>ans2) swap(ans1,ans2);
printf("%lld %lld\n",ans1,ans2);
}
else puts("NO");
}
return 0;
}
这两份代码的唯一区别是:
第一份代码的这个地方:
if((double)pq*pq-4.0*n<0){//pq 的意思为 p+q
puts("NO");
continue;
}
LL pq1=floor(sqrt((double)pq*pq-4.0*n));//p-q
修改为:
if(pq*pq-4*n<0){//pq 的意思为 p+q
puts("NO");
continue;
}
LL pq1=floor(sqrt(pq*pq-4*n));//p-q
这样就 AC 了!!!
请问这样可不可以申诉啊啊啊!