题目大意:n个人做成一圈,每个人手中的数是从Li到Ri(闭区间)等概率随机的,给定素数p,如果相邻两个人的数的乘积可以整除p,则两人分别得到1000元,求总得到钱数的期望。
首先,只考虑左边(也可以右边)的人的数是p的倍数的情况,概率为G(i)=(Ri/p-(Li-1)/p)/(Ri-Li+1),这个概率下可以两个人都得钱就是2000元。然后考虑左边人不满足而右边人满足的情况,概率为(1-G(i-1))*G(i),也是2000块。加起来即可。
注意:n个人是坐成一圈,1的旁边是2和n。答案精确到1e-6(逗比队友坑了半个多钟头也没看到)。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int n,p;
int l[110000],r[110000];
double ans;
double GAI(int x){
if(x==0)return GAI(n);
double mu=r[x]-l[x]+1;
double zi=r[x]/p-(l[x]-1)/p;
return zi/mu;
}
int main(){
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)scanf("%d%d",&l[i],&r[i]);
for(int i=1;i<=n;i++)ans+=GAI(i)*2.0*1000.0;
for(int i=1;i<=n;i++)ans+=GAI(i)*(1.0-GAI(i-1))*2.0*1000.0;
printf("%.10f\n",ans);
return 0;
}