E[移第i本书]=1+sigma{P[j在i上方]}(i!=j)。
考虑P[i][j]=P[j][i]pi+P[i][j](1-pj);
P[i][j]+p[j][i]=1.
两式联立得P[i][j]=pi/(pi+pj)
最后再把每个E[i]乘上p[i]即可
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
const int mod=1e9+7;
using namespace std;
int n;
ll p[1010];
ll ksm(ll a,int b)
{
ll re=1;
a%=mod;
while(b>0)
{
if(b&1) re=re*a%mod;
a=a*a%mod;
b=b/2;
}
return re;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
ll a,b;
scanf("%lld%lld",&a,&b);
p[i]=a*ksm(b,mod-2)%mod;
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ll sum=0;
for(int j=1;j<=n;j++)
if(i!=j) sum=(sum+p[j]*ksm(p[i]+p[j],mod-2)%mod)%mod;
ans=(ans+(1+sum)*p[i]%mod)%mod;
}
printf("%lld",ans);
return 0;
}
/*2
227494 333333
105839 333333
159073 999999
1493 142857
3422 333333
4945 37037
2227 111111
196276 999999
190882 999999
142721 999999
34858 999999
101914 999999*/