Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33511 | liuyile | 【BJ】T2 | C++ | 解答错误 | 80 | 5006 MS | 47140 KB | 3068 | 2024-10-09 19:03:16 |
// #pragma GCC optimize("Ofast") #include <bits/stdc++.h> using namespace std; #define endl "\n" #define int long long // #define double long double #define pii pair<int,int> #define p1(x) x.first #define p2(x) x.second int pr[2000003]; double p[2003000]; int a[2000300]; int n,m,c; const int M=1e9+7; inline bool cmp(int x,int y){ return p[x]>p[y]; } inline int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } inline int qp(int a,int x){ int res=1; while(x){ if(x&1)res=res*a%M; a=a*a%M; x>>=1; } return res; } inline int inv(int x){return qp(x,M-2);} inline double qp(double a,int x){ double res=1; while(x){ if(x&1)res=res*a; a=a*a; x>>=1; } return res; } inline double calceq(double p,int a,double q,int b){ return qp(p,b-1)*qp(q,a-1)*(1-p)*(1-q)/(1-qp(p,b)*qp(q,a)); } const double eps=3e-7; inline double calc(double p,int a,double q,int b){ int t=gcd(a,b); a/=t,b/=t; if(q<eps&&b)return qp(p,a/b); int k=b/a,c=b%a; if(k){ double t=(1-q)/q; q=q*qp(p,k); return t*q/(1-q)*calc(p,a,q,c); } else if(c==0)return 1; return 1-calc(q,b,p,a)-calceq(p,a,q,b); } inline int calceqm(int p,int a,int q,int b){ return qp(p,b-1)*qp(q,a-1)%M*(1-p+M)%M*(1-q+M)%M*inv((1-qp(p,b)*qp(q,a)%M+M))%M; } inline int calcm(int p,int a,int q,int b){ // cerr<<p<<" "<<a<<" "<<q<<" "<<b<<endl; // cerr.flush(); int t=gcd(a,b); a/=t,b/=t; int k=b/a,c=b%a; if(k){ int t=(1-q+M)*inv(q)%M; q=q*qp(p,k)%M; return t*q%M*inv(1-q+M)%M*calcm(p,a,q,c)%M; } else if(c==0)return 1; return (1-calcm(q,b,p,a)-calceqm(p,a,q,b)+2*M)%M; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); // int C=clock(); // freopen("genshin.in","r",stdin); // freopen("genshin.out","w",stdout); // cout<<calc(0.333333,2,0.666667,1)<<endl; // return 0; int t; scanf("%lld",&t); while(t--){ scanf("%lld%lld%lld",&n,&m,&c); for(int i=1;i<=n;i++) scanf("%lf%lld",&p[i],&a[i]),pr[i]=i;//p[i]/=c; sort(pr+1,pr+n+1,cmp); vector<int>T; int mx=0; for(int i=1;i<=n;i++) if(a[pr[i]]>mx){ mx=a[pr[i]]; T.push_back(pr[i]); } for(int i=1;i<=m;i++){ double q; int b; scanf("%lf%lld",&q,&b); // q/=c; int x=0; double mx=0; for(int i:T){ double w=calc(p[i]/c,a[i],q/c,b); // cerr<<i<<" "<<w<<" "<<p[i]<<" "<<a[i]<<" "<<q<<" "<<b<<endl; // return 0; if(w>mx)mx=w,x=i; } printf("%lld %.10lf %lld\n",x,mx,calcm((int)p[x]*inv(c)%M,a[x],(int)q*inv(c)%M,b)); // return 0; } } cout.flush(); return 0; }