Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33562 baka24 【BJ】T2 C++ 解答错误 0 5421 MS 4164 KB 2476 2024-10-10 08:31:44

Tests(0/10):


#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-9; 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); } LD f(LD x){return x/(1-x);} int f(int x){return x*Pow(1-x+Mod,Mod-2)%Mod;} LD calc(LD p,int x,LD q,int y){ // printf("%.15Lf %lld %.15Lf %lld\n",p,x,q,y); if(q<eps)return 1; if(y%x==0)return f(q*Pow(p,y/x))*(1-q)/q; int c=y%x,d=y/x,ny=y; LD nq=q; if(d)nq=q*Pow(p,d),ny=c; return (1-q)/q*(nq/(1-nq))*(1-calc(nq,ny,p,x)-sam(p,x,nq,ny)); } int calc(int p,int x,int q,int y){ if(y%x==0)return f(q*Pow(p,y/x)%Mod)*(1-q+Mod)%Mod*Pow(q,Mod-2)%Mod; int c=y%x,d=y/x,ny=y,nq=q; if(d)nq=q*Pow(p,d)%Mod,ny=c; return (1-q+Mod)%Mod*Pow(q,Mod-2)%Mod*(nq*Pow((1-nq+Mod)%Mod,Mod-2)%Mod)%Mod*(1-(calc(nq,ny,p,x)+sam(p,x,nq,ny))%Mod+Mod)%Mod; } void slv(){ n=read(),m=read(),c=read(); 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*Pow(c,Mod-2)%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++){ LD sum=calc((LD)a[i].p/c,a[i].x,pc,A); if(sum>ans)ans=sum,id=a[i].id,id2=i; // cout<<a[i].id<<" "<<sum<<endl; } int Pc=P*Pow(c,Mod-2)%Mod; int tmp=calc(a[id2].mp,a[id2].x,Pc,A); printf("%lld %.6Lf %lld\n",id,ans,tmp); } } signed main(){ int _=read();while(_--) slv(); return 0; }


测评信息: