题目描述
4和7是味味的幸运数字。幸运数是那些只由幸运数字组成的正整数。如47,477是幸运数,而5,17,417 就不是幸运数。
定义next(x)为大于或等于x的最小的幸运数。
味味对以下表达式的值很感兴趣 :
next(L)+next(L+1)+…+next(R-1)+next®。
现在告诉你L和R的值,希望你能帮助味味计算出这个表达式的值。
输入
输入文件sum.in仅一行包含两个正整数L和R(1≤L≤R≤10^9 ),L和R的值之间用一个空格分隔。
输出
输出文件sum.out 只有一行一个整数,表示表达式的值。
样例输入
【样例输入1】
2 7
【样例输入2】
7 7
样例输出
【样例输出1】
33
【样例输出2】
7
数据范围限制
对于 100%的数据,1≤L≤R≤10^9
提示
【样例 1 说明】
next(2)+next(3)+next(4)+next(5)+next(6)+next(7)=4+4+4+7+7+7=33
【样例 2 说明】
next(7)=7
分析
其实找到了幸运数的规律(4和7的变化)之后只要dfs举出幸运数即可。(有点懒,详见代码,易懂)。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long l,r,t,s,t1,x,ff,d[10001];
void dfs(long long x,long long y)
{
if(x==1)
{
t1++;
d[t1]=y;
return;
}
dfs(x-1,y*10+4);
dfs(x-1,y*10+7);
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
cin>>l>>r;
for(int i=1;i<=12;i++)
{
dfs(i,0);//预处理幸运数;
}
t=1;ff=l;
while(l>d[t]) t++;
while(ff<=r)
{
x=min(d[t]-ff,r-ff)+1;
s+=d[t]*x;
ff+=x;
t++;
}
cout<<s;
fclose(stdin);
fclose(stdout);
return 0;
}