比赛的时候,想到用表的方法进行统计,但是直到最后还是没敢敲
先打表生成一个幸运数的表
再枚举幸运数的表进行统计
注意打表时会超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);
}