提交时间:2024-10-10 09:13:28

运行 ID: 33564

#include<bits/stdc++.h> using namespace std; #define int long long #define LD long double #define D double #define fr first #define sc second const LD eps=1e-7; const int MAXN=100010,N=30,Mod=1000000007; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();return x*f;} int Pow(int x,int y){x=x%Mod;if(x<0)x+=Mod; int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;} return rt;} LD Pow(LD x,int y){LD rt=1;while(y){if(y&1)rt=rt*x;x=x*x;y>>=1;}return rt;} int n,m,c,p[MAXN]; struct node{ int x,p,mp,id; bool operator<(const node G)const{ return x!=G.x?x>G.x:p>G.p; } }a[MAXN]; LD sam(LD p,int x,LD q,int y){ return Pow(p,y-1)*Pow(q,x-1)*(1-p)*(1-q)/(1-Pow(p,y)*Pow(q,x)); } int sam(int p,int x,int q,int y){ return Pow(p,y-1)*Pow(q,x-1)%Mod*(1-p)%Mod*(1-q)%Mod*Pow((1-Pow(p,y)*Pow(q,x)%Mod+Mod)%Mod,Mod-2)%Mod; } LD f(LD x){return x/(1-x);} LD calc(LD p,int x,LD q,int y){ // printf("%.15Lf %lld %.15Lf %lld\n",p,x,q,y); if(q<eps)return Pow(p,y/x); if(x==1)return f(q*Pow(p,y/x))*(1-q)/q; if(y>x){ LD nq=q*Pow(p,y/x); int ny=y%x; return (1-q)/q*(nq/(1-nq))*calc(p,x,nq,ny); } return (1-calc(q,y,p,x)-sam(p,x,q,y)); } int calc(int p,int x,int q,int y){ if(x==1){ int v=Pow(p,y); return (1-q+Mod)%Mod*v%Mod*Pow(1-q*v%Mod+Mod,Mod-2)%Mod; } if(y>x){ int nq=q*Pow(p,y/x)%Mod,ny=y%x; return (1-q+Mod)%Mod*nq%Mod*Pow((1-nq+Mod)%Mod*q%Mod,Mod-2)%Mod*calc(p,x,nq,ny)%Mod; } return (1-(calc(q,y,p,x)+sam(p,x,q,y))%Mod+Mod)%Mod; } int gcd(int x,int y){return !x||!y?x|y:gcd(y%x,x);} void slv(){ n=read(),m=read(),c=read();int inv=Pow(c,Mod-2); for(int i=1;i<=n;i++){ a[i].p=read(),a[i].x=read();a[i].id=i; } sort(a+1,a+n+1); int tmp=n;n=0; for(int i=1;i<=tmp;i++){ if(a[i].p>p[i-1])a[++n]=a[i],p[i]=a[i].p; else p[i]=p[i-1]; } for(int i=1;i<=n;i++)a[i].mp=a[i].p*inv%Mod; while(m--){ int P=read(),A=read(),id=0,id2=0; LD ans=0,pc=(LD)P/c; for(int i=1;i<=n;i++){ int g=gcd(a[i].x,A); LD sum=calc((LD)a[i].p/c,a[i].x/g,pc,A/g); if(sum>ans)ans=sum,id=a[i].id,id2=i; // cout<<a[i].id<<" "<<sum<<endl; } int g=gcd(a[id2].x,A); int tmp=calc(a[id2].mp,a[id2].x/g,P*inv%Mod,A/g); printf("%lld %.6Lf %lld\n",id,ans,tmp); } } signed main(){ int _=read();while(_--) slv(); return 0; }