タイトルの説明
4と7はラッキーナンバーです。ラッキーナンバーは、ラッキーナンバーのみで構成される正の整数です。たとえば、47,477はラッキーナンバーであり、5,17,417はラッキーナンバーではありません。
次(x)を、x以上の最小のラッキーナンバーとして定義します。Weiwei
は、次の式の値に非常に興味を持っています:
next(L)+ next(L + 1)+ ... + next(R-1)+next®。
LとRの値を教えてください。Weiweiがこの式の値を計算するのに役立つことを願っています。
入力
入力ファイルsum.inの1行だけに2つの正の整数LとR(1≤L≤R≤10^ 9)が含まれており、LとRの値はスペースで区切られています。
アウトプット
出力ファイルsum.outには、式の値を表す1つの整数を含む1行のみがあります。
入力例
【入力例1】
2 7
【入力例2】
7 7
出力例
【出力例1】
33
【出力例2】
7
データ範囲の制限
100%データの場合、1≤L≤R≤10^ 9
プロンプト
[例1の説明]
次へ(2)+次へ(3)+次へ(4)+次へ(5)+次へ(6)+次へ(7)= 4 + 4 + 4 + 7 + 7 + 7 + 33 = 33
[例2説明】
次(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;
}