2020 Winter Holiday [gmoj2135] [合計ラッキーナンバー] [dfs列挙型]

タイトルの説明

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】

データ範囲の制限

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;
}

元の記事を110件公開 100 件を獲得 8034年を訪問

おすすめ

転載: blog.csdn.net/dglyr/article/details/104806619