学习心得(code)

superlong@CoreCoder

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

公告

文字可能放在http://blog.csdn.net/superlong100,此处存放代码

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新随笔

最新评论

  • 1. re: Poj 1279
  • 对于一个凹多边形用叉积计算面积 后能根据结果的正负来判断给的点集的时针方向?
  • --bsshanghai
  • 2. re: Poj 3691
  • 你写的这个get_fail() 好像并是真正的get_fail,也是说fail指向的串并不是当前结点的子串。为什么要这样弄呢?
  • --acmer1183
  • 3. re: HDU2295[未登录]
  • 这个是IDA* 也就是迭代加深@ylfdrib
  • --superlong
  • 4. re: HDU2295
  • 评论内容较长,点击标题查看
  • --ylfdrib
  • 5. re: HOJ 11482
  • 呵呵..把代码发在这里很不错..以后我也试试...百度的编辑器太烂了....
  • --csuft1

阅读排行榜

评论排行榜

#include <iostream>
#include 
<string>
#include 
<algorithm>
#include 
<cstdio>
#include 
<queue>
#include 
<map>
#define MAX 1000000000001LL
using namespace std;

queue 
< long long > q;
map 
< long longbool > mym;
long long ans[500001], num[500001];
int     len, ll;


void pre_for_lucky()
{
    
long long x;
    len 
= 0;
    
while(!q.empty()) q.pop();
    mym.clear();
    q.push(
4);    q.push(7);
    ans[
++ len] = 4;     ans[++ len] = 7;
    
while(!q.empty())
    {
        x 
= q.front();
        q.pop();
        
if( x * 10 + 4 <= MAX && !mym[x * 10 + 4])
        {
            ans[
++len] = x * 10 + 4;
            mym[x 
* 10 + 4= 1;
            q.push(x 
* 10 + 4);
        }
        
if( x * 10 + 7 <= MAX && !mym[x * 10 + 7])
        {
            ans[
++len] = x * 10 + 7;
            mym[x 
* 10 + 7= 1;
            q.push(x 
* 10 + 7);
        }
    }    
}
void dfs(long long x, int index)
{
    
long long temp;
    
int i;
    
for(i = index; i <= len; i ++)
    {
        temp 
= MAX / x;
        
if(temp < ans[i]) return;
        num[
++ ll] = x * ans[i];
        dfs(num[ll], i);
    }
}



int bsearch(long long x, int inc)
{
    
int l = 0, r = len + 1, mid = (l + r) / 2;
    
if(x < ans[1])   return inc;
    
if(x > ans[len]) return len + inc;
    
while(l < r)
    {
        
if(ans[mid] == x)         return mid;
        
if(ans[mid + 1== x)   return mid + 1;
        
if(ans[mid] < x && ans[mid + 1> x)
            
return mid + inc;
        
if(ans[mid] > x)
        {
            r 
= mid;
            mid 
= (l + r) / 2;
        }
        
else if(ans[mid] < x)
        {
            l 
= mid;
            mid 
= (l + r) / 2;
        }
    }
}


int main()
{
    freopen(
"in.txt","r",stdin);
    
int test;
    
long long l, r;
    pre_for_lucky();
    ll 
= 0;
    dfs(
11);
    num[
0= 0;
    num[ll 
+ 1= MAX;
    sort(num 
+ 1, num + ll + 1);
    len 
= 0;
    
for(int i = 1; i <= ll; i ++)
        
if(num[i] != num[i - 1]) 
            ans[
++len] = num[i];
    scanf(
"%d"&test);
    
while(test --)
    {
        scanf(
"%I64d %I64d"&l, &r);
        printf(
"%d\n",bsearch(r, 0- bsearch(l, 1+ 1);
    }
}

posted on 2009-08-30 17:58 superlong 阅读(414) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理