CodeForces - 121A Lucky Sum(dfs)

博客围绕幸运数展开,幸运数是仅含4和7的正整数。给定区间[l, r],需求next(l)到next(r)的和。思路是先搜出所有幸运数并排序,再遍历数组将区间内的幸运数相加,代码中有两种求法。

Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Let next(x) be the minimum lucky number which is larger than or equals x. Petya is interested what is the value of the expression next(l) + next(l + 1) + ... + next(r - 1) + next(r). Help him solve this problem.

Input

The single line contains two integers l and r (1 ≤ l ≤ r ≤ 109) — the left and right interval limits.

Output

In the single line print the only number — the sum next(l) + next(l + 1) + ... + next(r - 1) + next(r).

Please do not use the %lld specificator to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64d specificator.

Examples

Input

2 7

Output

33

Input

7 7

Output

7

Note

In the first sample: next(2) + next(3) + next(4) + next(5) + next(6) + next(7) = 4 + 4 + 4 + 7 + 7 + 7 = 33

In the second sample: next(7) = 7

(思路:首先把所有的幸运数全搜出来,然后排序。然后,只需要遍历搜到的幸运数数组,把包含在区间内的幸运数加起来即可。代码里有两种求法。当然,思路很麻烦的是我的。)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N =3000;
ll en=4444444444;
ll a[N];
int cnt;
void dfs(ll x)
{
	if(x>en) return ;
	a[++cnt]=x;
	dfs(x*10+4);
	dfs(x*10+7);
}
ll solve(ll x)
{
	ll res=0;
	for(int i=1;i<=cnt;i++)
	{
		if(x>a[i])
		{
			res+=(a[i]-a[i-1])*a[i];
		}
		else
		{
			res+=(x-a[i-1])*a[i];
			return res;
		}
	}
}
int main(void)
{
	cnt=0;
	dfs(4);
	dfs(7);
	sort(a+1,a+1+cnt);
	ll l,r,index;
	ll ans=0,pre;
	cin>>l>>r;
	index=lower_bound(a+1,a+1+cnt,l)-a;
	pre=l;
	if(r>a[index])
	{
		ans+=(a[index]-pre+1)*a[index];
		pre=a[index];
	}
	while(r>a[index])
	{
		ans+=(a[index]-pre)*a[index];
		pre=a[index++];
	}
	if(l>a[index-1])
	{
		ans+=(r-l+1)*a[index];
	}
	else
	{
		ans+=(r-a[index-1])*a[index];
	}
	//cout<<solve(r)-solve(l-1)<<endl;
	cout<<ans<<endl;
	return 0;
}

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值