Lucky Sum (dfs打表)
Lucky Sum
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
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
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
Input2 7
Output
33
Input
7 7
Output
7
Note
In the first sample: next(2)?+?next
In the second sample: next(7)?=?7
值得學習之處:
如何將luck number打表是本題的精華,果然還是要多做題啊
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6 typedef long long ll;
7 const int maxn=1e5+10;
8 ll mp[maxn];
9 int id=1;
10 void dfs(ll x,int cur)
11 {
12 if(cur>10)
13 return;
14 mp[id++]=x;
15 dfs(x*10+4,cur+1);
16 dfs(x*10+7,cur+1);
17 }
18 ll solve(ll x)
19 {
20 ll sum=0;
21 if(x==0)
22 return 0;
23 for(int i=1;i<=id;i++)
24 {
25 if(x>=mp[i])
26 {
27 sum+=mp[i]*(mp[i]-mp[i-1]);
28 }
29 else
30 {
31 sum+=mp[i]*(x-mp[i-1]);
32 break;
33 }
34 }
35 return sum;
36 }
37 int main()
38 {
39 ll l,r;
40 dfs(4,0);
41 dfs(7,0);
42 sort(mp+1,mp+id+1);
43 /* for(int i=0;i<20;i++)
44 printf("%d ",mp[i]);*/
45 scanf("%lld%lld",&l,&r);
46 printf("%lld\n",solve(r)-solve(l-1));
47 return 0;
48 }
Lucky Sum (dfs打表)