codeforces 621C(数学期望)

点击打开链接

//f[i] a[i]和a[(i+1)%n]之积能被p整除的概率  
//E=segmaE[i]=segma(f[i]*2000)

//如何求f[i]?

//因为p为素数 (a,p)=1,(b,p)=1 (ab,p)=1(反证法易证明)
//l[i]~r[i]中能被p整除的数的个数有: r/p-(l-1)/p (p组一个) 
//F[i](从a[i]中取出不被整除的概率)=1-r/p-(l-1)/p/(r-l+1)
//所以可以间接求出 f[i]=1-F[i]F[j]

   

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio> 
using namespace std;
const int N=1e5+20;
int l[N],r[N];
int p,a[N];
int n;
double f[N];
//f[i] a[i]和a[(i+1)%n]之积能被p整除的概率  
//如何求f[i]?				   
//因为p为素数 (a,p)=1,(b,p)=1 (ab,p)=1(反证法易证明)
//l[i]~r[i]中能被p整除的数的个数有: r/p-(l-1)/p (p组一个) 
//F[i](从a[i]中取出不被整除的概率)=1-r/p-(l-1)/p/(r-l+1)
//所以可以间接求出 f[i]=1-F[i]F[j])
//期望为(f[0]*2000+f[1]*2000...f[n]*2000) 
int main()
{
	cin>>n>>p;
	for(int i=0;i<n;i++)
	{
		cin>>l[i]>>r[i];
		a[i]=r[i]/p-(l[i]-1)/p;
		//a[i]值为l[i]~r[i]之间的&&能被p整除的个数 
	}
	double ans=0;
	for(int i=0;i<n;i++)
	{
		double num1=1-(1.0*a[i])/(1.0*(r[i]-l[i]+1));//P=E/S
		double num2=1-(1.0*a[(i+1)%n])/(1.0*(r[(i+1)%n]-l[(i+1)%n]+1)); 
		ans+=(1-num1*num2)*2000;
		//E=segma(E[i]) 
	}
	
	printf("%.10lf\n",ans);
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值