Lucky Numbers
Time Limit: 2 Sec Memory Limit: 64 MBSubmissions: 189 Solved: 30
Description
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).
Input
Multiple test cases. For each test case, there is only one line consist two numbers L and R.
Output
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 С++.
Sample Input
1 48 1 484848
Sample Output
1 7
HINT
Source
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