Isun loves digit 4 and 8 very much. He thinks a number is lucky only if the number satisfy the following conditions:
1. The number only consists of digit 4 and 8.
2. The number multiples 48.
One day, the math teacher gives Isun a problem:
Given L and R(1 <= L <= R <= 10^15), how many lucky numbers are there between L and R. (i.e. how many x satisfy L <= x <= R, x is a lucky number).
Multiple test cases. For each test case, there is only one line consist two numbers L and R.
For each test case, print the number of lucky numbers in one line.
Do use the %lld specifier or cin/ cout stream to read or write 64-bit integers in С++.
1 48 1 484848
1 7
Problem Setter : Yang Xiao
题意 : 某类数 只有4或者8组成 并且是48的倍数 问给定一个区间 L R ( 1--10^15) 问区间内这种数的个数
思路:
找出所有的 这类数 查找这类数是否在区间内
#include<stdio.h> #include<iostream> #include<queue> #include<set> using namespace std; #define ll long long priority_queue<ll,vector<ll>,greater<ll> >que;//从小到大排列 没必要 用queue一样 ll a[70000]; void DFS(ll num,int len)//一开始这个函数搞错了 一个劲的错 哎 都怪自己不细心 代码能力也不是很强 要努力了 { if(len>17) return ; if(num%48==0) que.push(num); DFS(num*10+4,len+1); DFS(num*10+8,len+1); } int main() { int i,n=0,cur=1,left,right; ll l,r; DFS(0,1); while(!que.empty()) { a[n++]=que.top(); que.pop(); } while(scanf("%lld %lld",&l,&r)!=EOF)//由于区间很大 不好直接查找 我们可以看哪个符合条件的数在区间内 { int cnt=0; for(i=1;i<n;i++) if(a[i]>=l&&a[i]<=r) cnt++; printf("%d\n",cnt); } return 0; }
http://acm.hust.edu.cn/problem.php?id=1600