[bzoj1853][Scoi2010][幸运数字] (容斥原理)

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

Solution

#include <stdio.h>
#include <algorithm>
#define N 10010
#define L long long
template < class T > void EC(T &a , T &b)
{
    T t=a;
    a=b;
    b=t;
}
template < class T > T GD(T a , T b)
{
    return b ? GD(b , a % b) : a;
}
int _t,_n;
bool V[N];
L l , r , A[N] , ans;
void PR(int x , L y)
{
    if(y > r)
        return;
    if(x)
        A[++_t] = y;
    PR(x + 1 , y * 10 + 6);
    PR(x + 1 , y * 10 + 8);
}
void DF(int x , int y , L z)
{
    if(x > _n)
        {
        if(y)
            ans += y & 1 ? r / z - (l - 1) / z : (l - 1) / z - r / z;
        return;
        }
    DF(x + 1 , y , z);
    L t = z / GD(z , A[x]);
    if(((double)A[x] * t) <= r)
        DF(x + 1 , y + 1 , A[x] * t);
}
int main()
{
    scanf("%lld%lld" , &l , &r);
    PR(0 , 0);
    std::sort(A + 1 , A + _t + 1);
    for(int i = 1;i <= _t;i++)
        if(!V[i])
            {
            A[++_n]=A[i];
            for(int j = i + 1;j <= _t;j++)
                if(A[j] % A[i] == 0)
                    V[j]=1;
            }
    for(int i = 1;i + i <= _n;i++)
        EC(A[i],A[_n-i+1]);
    DF(1 , 0 , 1);
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-12-14 18:45:12

[bzoj1853][Scoi2010][幸运数字] (容斥原理)的相关文章

BZOJ-1853: [Scoi2010]幸运数字 (容斥原理)

1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2947  Solved: 1096[Submit][Status][Discuss] Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是"幸运号码"!但是这种"幸运号码"总是太少

1853: [Scoi2010]幸运数字[容斥原理]

1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status][Discuss] Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,

【bzoj1853】[Scoi2010]幸运数字 容斥原理+搜索

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

BZOJ1853 SCOI2010 幸运数字 DFS+容斥原理

题意:求[a,b]中含有6 8或因子含有6 8的数的个数 题解: 我们用容斥的思想,先求出1->b的方案数,再减去1->a-1的方案数 首先我们一遍DFS求出所有由6和8组成的数的数量 然后将搜索得到的所有数排序,如果存在a%b==0,那就把a给删了(打个标记). 由于得到的数非常少,所以我们可以枚举乘积可能得到的数字num,那么就会有N/num个数含有num这个因子,因此ans+=N/num. 两个细节上的问题: 1.如果我们当前枚举得到的乘积为a,需要乘下一个数b搜索到下一层时,只需要传递

bzoj1853 [Scoi2010]幸运数字

题目链接 容斥原理 虽然只含6.8的数有很多 但是题解告诉我真正互质的只有10+个woc 然后容斥原理,注意爆long long ,用double 近似比较 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath

BZOJ 1853 SCOI2010 幸运数字 容斥原理+DFS

题目大意:求[l,r]区间内有多少个数是只由6和8组成的数的倍数 同2393 链接:http://blog.csdn.net/popoqqq/article/details/41807333 此题数据强力了一些 由于r<=10^10 所以计算LCM的时候会爆long long 于是我们可以用double求出LCM的近似值与r进行比较 如果小于r再取精确值进行计算 此外就是搜索的时候要从大到小搜 从小到大会TLE #include <cstdio> #include <cstring

【BZOJ1853/2393】[Scoi2010]幸运数字/Cirno的完美算数教室 DFS+容斥

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

AC日记——[SCOI2010]幸运数字 bzoj 1853

1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status][Discuss] Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,

bzoj 1853: [Scoi2010]幸运数字 容斥

1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1170  Solved: 406[Submit][Status] Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,