IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    bzoj1853【SCOI2010】幸运数字

    summer发表于 2016-05-27 15:48:54
    love 0

    1853: [Scoi2010]幸运数字

    Time Limit: 2 Sec  Memory Limit: 64 MB
    Submit: 1837  Solved: 673
    [Submit][Status][Discuss]

    Description

    在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”。lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”。 现在lxhgww想知道在一段闭区间[a,
    b]内,“近似幸运号码”的个数。

    Input

    输入数据是一行,包括2个数字a和b

    Output

    输出数据是一行,包括1个数字,表示在闭区间[a, b]内“近似幸运号码”的个数

    Sample Input

    【样例输入1】

    1 10

    【样例输入2】

    1234 4321

    Sample Output

    【样例输出1】

    2

    【样例输出2】

    809

    HINT

    【数据范围】
    对于30%的数据,保证1 < =a < =b < =1000000
    对于100%的数据,保证1 < =a < =b < =10000000000

    Source

    Day1

    容斥原理+搜索剪枝

    方法同bzoj2393,但是这道题数据范围略大,所以DFS得时候要从后往前DFS,这样剪枝优化更明显。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define F(i,j,n) for(int i=j;i<=n;i++)
    #define D(i,j,n) for(int i=j;i>=n;i--)
    #define ll long long
    #define maxn 3005
    using namespace std;
    int cnt,tot;
    ll l,r,ans,a[maxn],b[maxn];
    bool tag[maxn];
    void find(ll x)
    {
    if (x>r) return;
    a[++cnt]=x;
    find(x*10+6);find(x*10+8);
    }
    ll gcd(ll a,ll b)
    {
    return !b?a:gcd(b,a%b);
    }
    void dfs(int x,int flag,ll t)
    {
    if (!x)
    {
    if (t!=1) ans+=(r/t-(l-1)/t)*flag;
    return;
    }
    dfs(x-1,flag,t);
    ll tmp=gcd(t,a[x]);
    if ((double)t*a[x]/tmp>(double)r) return;
    dfs(x-1,-flag,t/tmp*a[x]);
    }
    int main()
    {
    scanf("%lld%lld",&l,&r);
    find(6);find(8);
    sort(a+1,a+cnt+1);
    F(i,1,cnt) F(j,1,i-1) if (a[i]%a[j]==0){tag[i]=1;break;}
    for(int i=1;a[i];i++) if (!tag[i]) b[++tot]=a[i];
    cnt=tot;
    F(i,1,cnt) a[i]=b[i];
    dfs(cnt,-1,1);//要从大往小搜索,不然会TLE
    printf("%lld\n",ans);
    }



沪ICP备19023445号-2号
友情链接