Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33501 | LYLAKIOIAKIOI | 【BJ】T2 | C++ | 解答错误 | 0 | 6111 MS | 39316 KB | 3964 | 2024-10-09 18:55:29 |
#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; if(fabs(a)<eps) a=0;if(fabs(x)<eps) x=0; }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){ //cout<<dl<<' '<<dr<<' '<<uu<<' '<<ud<<endl; 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) dl=0;if(fabs(dr)<eps) dr=0; double tmp=cal_eq1(dl,dr,uu,ud);//cout<<tmp<<endl; if(md==0){ return C*(dl*qp1(dr,rt))/(1-(dl*qp1(dr,rt))); }else if(rt!=0){ dl=dl*qp1(dr,rt);uu=md;C*=(1-dl)/dl; }else{ C=1; }//cout<<calc1(dr,dl,ud,uu,C)*(1-dr)/dr+tmp<<endl; return C*(1-tmp-calc1(dr,dl,ud,uu)); } 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]); //cout<<id<<' '<<ans<<endl; return ans; }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; } int calc2(int dl,int dr,int uu,int ud){ //cout<<dl<<' '<<dr<<' '<<uu<<' '<<ud<<endl; ll C=1ll*(mod+1-dl)*inv(dl)%mod; int x=gcd(uu,ud);uu/=x,ud/=x; int rt=uu/ud,md=uu%ud; //if(fabs(dl)<eps) dl=0;if(fabs(dr)<eps) dr=0; int tmp=cal_eq2(dl,dr,uu,ud);//cout<<tmp<<endl; 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=1ll*C*(1-dl)%mod*inv(dl)%mod; }else{ C=1; }//cout<<calc1(dr,dl,ud,uu,C)*(1-dr)/dr+tmp<<endl; return C*(mod+mod+1-tmp-calc2(dr,dl,ud,uu))%mod; }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,mxm=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, mxm=calc2(1ll*p*inv(c)%mod,1ll*P[b[j].id]*inv(c)%mod,a,A[b[j].id]); }printf("%d %.10Lf %d\n",mxid,mxvl,mxm); //fflush(stdout); //fflush(stdout); //cerr<<(clock()-C)/CLOCKS_PER_SEC<<endl; } } int main(){ //double C=clock(); int t;scanf("%d",&t); while(t--) slv(); //cerr<<(clock()-C)/CLOCKS_PER_SEC; }