求助
查看原帖
求助
1352501
jms23012楼主2024/8/1 22:05

我的想法是这样的:

n=pq,n-ed+2=p+q=m

所以可以得到一个二元二次方程:

p+q=m(1),p*q=n(2)

(1)平方-4*(2)再开根号,得到p-q(3)

((1)+(3))/2就得到p,m-p就是q

考虑用的是整型变量再加个判断就搞定了

三次的代码如下

#include <bits/stdc++.h>
using namespace std;
unsigned long long k,n,d,e,p,q,m;
int main(){
	scanf("%d",&k);
	for(int i=1;i<=k;i++){
		scanf("%d%d%d",&n,&d,&e);
		m=n-e*d+2;//m=p+q;
		p=(m+sqrt(m*m-4*n))/2;
		if(p*(m-p)==n) cout<<min(p,m-p)<<' '<<max(p,m-p)<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
} 
#include <bits/stdc++.h>
using namespace std;
unsigned long long k,n,d,e,p,q,a;
int main(){
	scanf("%d",&k);
	for(int i=1;i<=k;i++){
		scanf("%d%d%d",&n,&d,&e);
		p=((n-e*d+2)+int(sqrt((n-e*d+2)*(n-e*d+2)-4*n)))/2;
		q=n-e*d+2-p;
		if(p*q==n){
			if(p>q) swap(p,q);
			printf("%d %d\n",p,q);
		}
		else printf("NO\n");
	}
	return 0;
} 
#include <bits/stdc++.h>
using namespace std;
unsigned long long k,n,d,e,p,q,a;long double b;
int main(){
	scanf("%d",&k);
	for(int i=1;i<=k;i++){
		scanf("%d%d%d",&n,&d,&e);
		p=((n-e*d+2)+sqrt((n-e*d+2)*(n-e*d+2)-4*n))/2;
		q=n/p;
		a=sqrt((n-e*d+2)*(n-e*d+2)-4*n);
		b=sqrt((n-e*d+2)*(n-e*d+2)-4*n);
		if(a!=b){
			printf("NO\n");
			continue;
		}
		if(p+q==n-e*d+2){
			if(p>q) swap(p,q);
			printf("%d %d\n",p,q);
		}
		else printf("NO\n");
	}
	return 0;
} 

然后都是六十分,两个subtask七八九十都WA

详情R169988876

考虑过溢出但我已经用了最大的unsigned long long了

求大佬调+瑞平qwq

2024/8/1 22:05
加载中...