提交时间:2024-10-09 18:25:29

运行 ID: 33487

#include<bits/stdc++.h> #define ll long long #define PII pair<int,int> #define P3I pair<int,PII> #define PFI pair<double,int> #define mk make_pair #define fi first #define se second #define double long double using namespace std; const int N=2e6+10,mod=1e9+7; double eps=1e-10; int n,m,c; int P[N],A[N]; int tp=0; struct nd{ int id,p,a; }b[N]; bool cmp(nd a,nd b){ return a.p<b.p; } set<PII> q; int fl=0; int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; b>>=1;a=1ll*a*a%mod; }return x; }double qp1(double a,int b){ double x=1; while(b){ if(b&1) x=x*a; b>>=1;a=a*a; }return x; } int gcd(int a,int b){ if(min(a,b)==0) return max(a,b); if(!((a&1)||(b&1))) return 2*gcd(a/2,b/2); if(!(a&1)) a/=2;if(!(b&1)) b/=2; return gcd(min(a,b),abs(a-b)); }int inv(int x){ return qp(x,mod-2); } double cal_eq1(double dl,double dr,int ul,int ur){ return qp1(dl,ur-1)*qp1(dr,ul-1)*(1-dl)*(1-dr)/(1-qp1(dl,ur)*qp1(dr,ul)); } double calc1(double dl,double dr,int uu,int ud,double C){ //cout<<dl<<' '<<dr<<' '<<uu<<' '<<ud<<endl; int x=gcd(uu,ud);uu/=x,ud/=x; int rt=uu/ud,md=uu%ud; double tmp=cal_eq1(dl,dr,uu,ud);//cout<<tmp<<endl; if(md==0){ return (dl*qp1(dr,rt))/(1-(dl*qp1(dr,rt))); }else if(rt!=0){ dl=dl*qp1(dr,rt);uu=md; }//cout<<calc1(dr,dl,ud,uu,C)*(1-dr)/dr+tmp<<endl; return (1/C-tmp/C-((1-dr)/dr)*calc1(dr,dl,ud,uu,C*(1-dr)/dr)/C); } double calc(int p,int a,int id){ /*int lim=100000;//if(fl) lim=80; double C=(1-p*1.0/c)/(p*1.0/c); double e=p*1.0/c,tmp=1,tmp2=1;ll la=0; double ans=0; for(int i=1;i<=lim;i++){ tmp*=e; ll now=(1ll*i*a)/A[id]; while(la<now) la++,tmp2*=(P[id]*1.0/c); ans+=tmp*tmp2;if(fabs(tmp*tmp2)<eps) break; }ans*=C;*/ double ans=calc1(p*1.0/c,P[id]*1.0/c,a,A[id],(1-p*1.0/c)/(p*1.0/c))*(1-p*1.0/c)/(p*1.0/c); //cout<<id<<' '<<ans<<endl; return ans; }void slv(){ scanf("%d%d%d",&n,&m,&c); if(n>=200) fl=1; //cin>>n>>m>>c; int p,a;tp=0; for(int i=1;i<=n;i++) scanf("%d%d",&P[i],&A[i]); for(int i=1;i<=n;i++) b[i]=(nd){i,P[i],A[i]}; sort(b+1,b+n+1,cmp);q.clear(); for(int i=1;i<=n;i++){ auto it=q.upper_bound(mk(b[i].a,b[i].id)); while(it!=q.begin()){ q.erase((--it)); it=q.upper_bound(mk(b[i].a,b[i].id)); }q.insert(mk(b[i].a,b[i].id)); }for(auto ed:q){ b[++tp]=(nd){ed.se,P[ed.se],A[ed.se]}; } for(int i=1;i<=m;i++){ //double C=clock(); scanf("%d%d",&p,&a);int mxid=0;double mxvl=0; for(int j=1;j<=tp;j++){ double res=calc(p,a,b[j].id); if(res>mxvl) mxvl=res,mxid=b[j].id; }printf("%d %.10Lf %d\n",mxid,mxvl,0); //fflush(stdout); //fflush(stdout); //cerr<<(clock()-C)/CLOCKS_PER_SEC<<endl; } } int main(){ //freopen("sword.in","r",stdin); //freopen("sword.out","w",stdout); //double C=clock(); int t;scanf("%d",&t); while(t--) slv(); //cerr<<(clock()-C)/CLOCKS_PER_SEC; }