是这样的,eps精确就T,不精确就WA(
#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const double eps1=1e-16;
const double eps2=1e-16;
double l,r,bao,mid;
int n,q,k,dq,a[100005],b[100005];
int gcd(int x,int y){return y?gcd(y,x%y):x;}
int pd(double mid){
int ans=0,dq=0;
for(int i=1;i<=n;i++){
while(dq<n&&1.0*a[dq+1]/b[i]<=mid) dq++;
ans+=dq;
}
return ans;
}
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
//LL!
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1);
sort(b+1,b+n+1);
while(q--){
cin>>k;
l=0;r=1e6;bao=0;
while(r-l>=eps1){
mid=(l+r)/2;//db
if(pd(mid)>=k) bao=mid,r=mid;
else l=mid;
}
dq=0;
for(int i=1;i<=n;i++){
while(dq<n&&bao*b[i]-a[dq+1]<=eps2&&fabs(a[dq+1]-bao*b[i])>eps2) dq++;
if(fabs(a[dq+1]-bao*b[i])<=eps2){
int fz=a[dq+1],fm=b[i],gd=gcd(fz,fm);
fz/=gd;fm/=gd;
cout<<fz<<" "<<fm<<"\n";
break;
}
}
}
return 0;
}