雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

统计算概率——Codeforces Beta Round #84 D

Posted on 2011-08-30 16:06  huhuuu  阅读(272)  评论(0编辑  收藏  举报

比赛的时候,想到用表的方法进行统计,但是直到最后还是没敢敲

先打表生成一个幸运数的表

再枚举幸运数的表进行统计

注意打表时会超int,果断__int64

View Code
#include<iostream>
#include
<algorithm>
using namespace std;
__int64 pl,pr,vl,vr,k;
__int64 len
=0;
__int64 c[
10009];
void dfs(__int64 n)//生成4,7...的表
{
if(n>pr&&n>vr)
return;
c[len]
=n;
len
++;
dfs(n
*10+4);
dfs(n
*10+7);
}

double poss(__int64 l1,__int64 r1,__int64 l2,__int64 r2)//计算(l1,r1)在(l2,r2)的概率
{
if(l1<l2)l1=l2;
if(r1>r2)r1=r2;
if(l1>r1)return 0;
else return (r1-l1+1)*1.0/(r2-l2+1);
}

int main()
{

scanf(
"%d%d%d%d%d",&pl,&pr,&vl,&vr,&k);

__int64 i;
dfs(
0);
c[len]
=1000000000;
len
--;
double ret=0;
sort(
&c[0],&c[len+1]);
for(i=1;i+k-1<=len;i++)
{
ret
+=poss(max(c[i-1]+1,pl),c[i],pl,pr)*poss(c[i+k-1],min(vr,c[i+k]-1),vl,vr);//
ret+=poss(max(c[i-1]+1,vl),c[i],vl,vr)*poss(c[i+k-1],min(pr,c[i+k]-1),pl,pr);//
if(k==1)
{
ret
-=poss(c[i],c[i],pl,pr)*poss(c[i],c[i],vl,vr);//如 (4,4)(4,4)会统计两次所以减去,而(1,4)(4,1)没事
}
}
printf(
"%.11lf",ret);

}