2020寒假【gmoj2135】【sum幸运数】【dfs枚举】

题目描述

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

发布了110 篇原创文章 · 获赞 100 · 访问量 8034

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/104806619
今日推荐