E 幸运数字Ⅱ
https://ac.nowcoder.com/acm/contest/5086/E
思路:幸运数字在1e9的范围内,数量也就2000多个。
于是我们可以dfs求出所有幸运数字,然后遍历即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll base[3000]; int num; 5 int tmp[15]; 6 void dfs(int limit,int step,int val) 7 { 8 tmp[step]=val; 9 if(step==limit){ 10 num++; 11 ll res=0; 12 for(int i=1;i<=limit;i++){ 13 res=res*10+tmp[i]; 14 } 15 base[num]=res; 16 return; 17 } 18 dfs(limit,step+1,4); 19 dfs(limit,step+1,7); 20 } 21 void init() 22 { 23 for(int i=1;i<=10;i++){ 24 dfs(i,0,0); 25 } 26 } 27 int main() 28 { 29 init(); 30 // printf("num:%d\n",num); 31 // for(int i=1;i<=100;i++) 32 // printf("%d\n",base[i]); 33 ll L,R; 34 scanf("%lld%lld",&L,&R); 35 ll ans=0; 36 for(int i=1;i<=num;i++){ 37 if(L>R) break; 38 if(base[i]>=L){ 39 if(base[i]<=R){ 40 ans=ans+(base[i]-L+1)*base[i]; 41 L=base[i]+1; 42 } 43 else{ 44 ans=ans+(R-L+1)*base[i]; 45 L=R+1; 46 } 47 } 48 } 49 printf("%lld\n",ans); 50 return 0; 51 }