思路:
递归枚举所有幸运数,然后分段处理,一段一段的做乘法。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long l,r,ans,c=1,js,ii;
long long f[5010],hi;
void dfs(long long dep,long long xys) //递归求幸运数
{
if(dep==1)
{
f[++hi]=xys;
return;
}
dfs(dep-1,xys*10+4);
dfs(dep-1,xys*10+7);
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
cin>>l>>r;
ii=l;
for(int i=1; i<=12; i++) //最大12位
dfs(i,0);
while(l>f[c]) //移到恰当的位置
c++;
while(ii<=r) //分段处理
{
js=min(f[c]-ii,r-ii)+1;
ans+=f[c]*js;
ii+=js;
c++;
}
printf("%lld",ans);
return 0;
}