提交时间:2024-10-09 19:09:25

运行 ID: 33519

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=2e6+10,mod=1e9+7; const double eps=1e-9; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,C; struct nd { int p,a,id; }d[maxn],T[maxn]; bool cmp(nd a,nd b){ if(a.p==b.p)return a.a>b.a; return a.p>b.p; } int qp(int a,int b){a%=mod; int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod,b>>=1; }return res; } double qp2(double a,int b){ double res=1; while(b){ if(b&1)res=res*a; a=a*a;b>>=1; }return res; } double calc_equal(double p,ll a,double q,ll b){ double res=1; res=res*(1-p)*(1-q)*qp2(p,b-1)*qp2(q,a-1)/(1-qp2(p,b)*qp2(q,a)); return res; } int calc_equal(int p,ll a,int q,ll b){ int res=1; int w=(1-qp(p,b)*1ll*qp(q,a)%mod+mod)%mod; res=res*1ll*(1+mod-p)%mod*1ll*(1+mod-q)%mod*1ll*qp(p,b-1)%mod*1ll*qp(q,a-1)%mod*1ll*qp(w,mod-2)%mod; return res%mod; } int calc(int p,ll a,int q,ll b){ if(a==1){ int w=q*1ll*qp(p,b)%mod; int res=(mod-w)%mod*1ll*qp((w+mod-1)%mod,mod-2)%mod; res=res*1ll*(1+mod-q)%mod*1ll*qp(q,mod-2)%mod; return res; }if(b>=a){ q=q*1ll*qp(p,b/a)%mod;b%=a; return calc(p,a,q,b); }//cout<<"test "<<calc_equal(p,a,q,b)<<endl; return (1+mod-(calc_equal(p,a,q,b)+calc(q,b,p,a))%mod)%mod; } double calc(double p,ll a,double q,ll b){ if(a==1){ double w=q*qp2(p,b); double res=-w/(w-1); res=res*(1-q)/q;return res; }if(b>=a){ q=q*qp2(p,b/a);b%=a; return calc(p,a,q,b); }auto it=1-calc_equal(p,a,q,b)-calc(q,b,p,a); return it; } ll gcd(ll x,ll y){return ((!y)?x:gcd(y,x%y));} void slv(){ n=read(),m=read(),C=read(); int iC=qp(C,mod-2); up(i,1,n)d[i].p=read(),d[i].a=read(),d[i].id=i; sort(d+1,d+n+1,cmp); T[1]=d[1];int c=1;up(i,2,n){ if(d[i].a<T[c].a)continue; T[++c]=d[i]; }n=c;up(i,1,n)d[i]=T[i]; //cout<<"? "<<n<<endl; //up(i,1,n)cout<<"? "<<d[i].id<<endl; while(m--){ int x=read(),y=read(); int id=0,res=0;double mx=0; up(i,1,n){ int g=gcd(d[i].a,y); //cout<<d[i].a<<" "<<y<<" "<<g<<"\n"; double f=calc(d[i].p*1.0/C,d[i].a/g,x*1.0/C,y/g); //cout<<"? "<<f<<endl; if(f<mx)continue; int w=calc(int(d[i].p*1ll*iC%mod),d[i].a/g,int(x*1ll*iC%mod),y/g); //cout<<"! "<<w<<" "<<f<<endl; mx=f,id=d[i].id,res=w; }printf("%d %.8lf %d\n",id,mx,res); } }int main(){ //freopen("sword.in","r",stdin); //freopen("sword.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }