提交时间:2024-10-09 21:27:09

运行 ID: 33551

#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 using namespace std; const int N=2e6+10,mod=1e9+7; const double eps=1e-7; int n,m,c; int P[N],A[N]; int tp=0; inline bool isd(char ch){ return ch>='0'&&ch<='9'; } inline int read(){//ex - char ch=getchar(); int x=0,f=1; while(!isd(ch)) ch=getchar(); while(isd(ch)) x=10*x+ch-'0',ch=getchar(); return x*f; } 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; inline 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; }inline double qp1(double a,int b){ double x=1; while(b){ if(b&1) x=x*a; b>>=1;a=a*a; //if(fabs(a)<eps) a=0; if(fabs(x)<eps) return 0; }return x; } inline 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)); }inline int inv(int x){ return qp(x,mod-2); } inline 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)); } inline double calc1(double dl,double dr,int uu,int ud){ double C=(1-dl)/dl; //int x=gcd(uu,ud);uu/=x,ud/=x; int rt=uu/ud,md=uu%ud; if(fabs(dl)<eps) { return qp1(dr,uu/ud); }if(fabs(dr)<eps) dr=0; double tmp=cal_eq1(dl,dr,uu,ud); if(fabs(tmp)<eps) tmp=0; if(md==0){ double tmp=qp1(dr,rt); return C*(dl*tmp)/(1-(dl*tmp)); }else if(rt!=0){ dl=dl*qp1(dr,rt);uu=md;C/=(1-dl)/dl; return C*calc1(dl,dr,uu,ud); }return (1-tmp-calc1(dr,dl,ud,uu)); } inline double calc(int p,int a,int id){ int G=gcd(a,A[id]); double ans=calc1(p*1.0/c,P[id]*1.0/c,a/G,A[id]/G); return ans; }inline int cal_eq2(int dl,int dr,int ul,int ur){ return 1ll*qp(dl,ur-1)*qp(dr,ul-1)%mod*(mod+1-dl)%mod*(mod+1-dr)%mod*inv(mod+1-1ll*qp(dl,ur)*qp(dr,ul)%mod)%mod; } inline int calc2(int dl,int dr,int uu,int ud){ ll C=1ll*(mod+1-dl)*inv(dl)%mod; int rt=uu/ud,md=uu%ud; int tmp=cal_eq2(dl,dr,uu,ud); if(md==0){ return C*dl%mod*qp(dr,rt)%mod*inv(mod+1-(1ll*dl*qp(dr,rt)%mod))%mod; }else if(rt!=0){ dl=1ll*dl*qp(dr,rt)%mod;uu=md;C=C*inv(mod+1-dl)%mod*(dl)%mod; return 1ll*C*calc2(dl,dr,uu,ud)%mod; }return (mod+mod+1-tmp-calc2(dr,dl,ud,uu))%mod; }inline void slv(){ n=read(),m=read(),c=read(); int p,a;tp=0; for(int i=1;i<=n;i++) P[i]=read(),A[i]=read(); for(int i=1;i<=n;i++) b[i]=(nd){i,P[i],A[i]}; sort(b+1,b+n+1,cmp);int mxv=0; for(int i=1;i<=n;i++){ if(b[i].a>mxv){ mxv=b[i].a; b[++tp]=b[i]; } } for(int i=1;i<=m;i++){ p=read(),a=read();int mxid=0,mxm=0;double mxvl=0; for(int j=1;j<=tp;j++){ double res=calc(p,a,b[j].id);int G=gcd(a,A[b[j].id]); if(res>mxvl) mxvl=res,mxid=b[j].id, mxm=calc2(1ll*p*inv(c)%mod,1ll*P[b[j].id]*inv(c)%mod,a/G,A[b[j].id]/G); }printf("%d %.10lf %d\n",mxid,mxvl,mxm); } } int main(){ int t;scanf("%d",&t); while(t--) slv(); }