【容斥原理】幸运数字

四川省选Scoi2010第一试

幸运数字

 

【题目描述】

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

现在lxhgww想知道在一段闭区间[a,b]内,“近似幸运号码”的个数。

【输入】

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

【输出】

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

【样例输入1】

1 10

【样例输出1】

2

【样例输入2】

1234 4321

【样例输出2】

809

【数据范围】

   对于30%的数据,保证1<=a<=b<=1000000

   对于100%的数据,保证1<=a<=b<=10000000000



比较裸的容斥原理。首先打表生成了所有的6和8的组合,但又不是之前的数的倍数的数,总共有1000多个。

读取的时候把大于b的都排除了。(注意一定要用降序。因为在搜索的时候,加有剪枝,可以尽早剪掉大枝)

[a,b]的“近似幸运数字”=[1,b]的 - [1,a-1]的。




可以采用这种方法。在dfs里枚举每一个数字要或是不要,求最小公倍数(即求交集的过程)(如果要,一定要满足最小公倍数小于edge)

如果要,就不变符号,如果不要,就变符号(减法实现)

但是注意这个程序有两个问题:

1、如果每个数都不要,那么最小公倍数会变成1,然后就会返回edge,这个是多余的

2、考虑边界上,如果只要最后一个,则返回[edge/a[max]],而且是+,因此可知,符号全都反了

综上,为了符合奇加偶减,则在最外面变一次号,因此多余的edge变成了-edge,在加上edge。



#include 
#include 
typedef long long ll;
ll a;
ll b;
ll table[]={0,6,8,68,86,668,686,688,866,868,886,6668,6686,6688,6866,6886,8666,8668,8866,66668,66686,66688,66866,66868,66886,68666,68668,68686,68866,68888,86666,86668,86686,86866,88868,88886,666668,666686,666688,666866,666868,666886,668666,668686,668866,668888,686666,686668,686866,686888,688666,688868,688886,688888,866666,866668,866686,868666,868886,886666,886868,888668,888686,888866,888868,888886,6666668,6666686,6666688,6666866,6666868,6666886,6668666,6668668,6668686,6668866,6668888,6686666,6686668,6686686,6686866,6686888,6688666,6688688,6688868,6688886,6688888,6866666,6866668,6866686,6866866,6866888,6868666,6868688,6868868,6868886,6868888,6886666,6886688,6886868,6886886,6886888,6888668,6888686,6888688,6888866,6888868,6888886,8666666,8666686,8666866,8668666,8668868,8686666,8686868,8686886,8688668,8688686,8688866,8688868,8688886,8866666,8866868,8866886,8868668,8868686,8868866,8868868,8868886,8886668,8886686,8886866,8886868,8886886,8888666,8888668,8888686,8888866,66666668,66666686,66666688,66666866,66666868,66666886,66668666,66668668,66668686,66668866,66668888,66686666,66686686,66686866,66686888,66688666,66688688,66688868,66688886,66688888,66866666,66866668,66866866,66866888,66868666,66868688,66868868,66868886,66868888,66886666,66886868,66886886,66886888,66888668,66888686,66888688,66888866,66888868,66888886,68666666,68666668,68666686,68666888,68668666,68668688,68668868,68668886,68668888,68686666,68686688,68686886,68686888,68688668,68688686,68688688,68688866,68688868,68688886,68866666,68866688,68866868,68866888,68868668,68868686,68868688,68868866,68868868,68868886,68886668,68886686,68886866,68886868,68886886,68888666,68888668,68888686,68888866,68888888,86666666,86666668,86666686,86666866,86668868,86668886,86686666,86686868,86686886,86688686,86688866,86688868,86688886,86866666,86866868,86866886,86868668,86868868,86868886,86886668,86886686,86886866,86886868,86886886,86888666,86888668,86888686,86888866,88666666,88666868,88666886,88668686,88668868,88668886,88686668,88686686,88686866,88686868,88686886,88688666,88688668,88688686,88688866,88866668,88866866,88866868,88866886,88868666,88868668,88868686,88868866,88886666,88886668,88886686,88886866,88888666,88888868,88888886,666666668,666666686,666666688,666666866,666666868,666666886,666668666,666668668,666668686,666668866,666668888,666686666,666686668,666686686,666686866,666686888,666688666,666688688,666688868,666688886,666688888,666866666,666866668,666866686,666866866,666866888,666868666,666868688,666868868,666868886,666868888,666886666,666886688,666886868,666886886,666886888,666888668,666888686,666888688,666888866,666888868,666888886,668666666,668666668,668666686,668666866,668666888,668668666,668668688,668668868,668668886,668668888,668686666,668686688,668686868,668686886,668686888,668688668,668688686,668688688,668688866,668688868,668688886,668866666,668866688,668866868,668866886,668866888,668868668,668868686,668868688,668868866,668868868,668868886,668886668,668886686,668886688,668886866,668886868,668886886,668888666,668888668,668888686,668888866,668888888,686666666,686666668,686666686,686666866,686666888,686668666,686668688,686668868,686668886,686668888,686686666,686686688,686686868,686686886,686686888,686688668,686688686,686688688,686688866,686688868,686688886,686866666,686866688,686866868,686866886,686866888,686868668,686868686,686868688,686868866,686868868,686868886,686886668,686886686,686886688,686886866,686886868,686886886,686888666,686888668,686888686,686888866,686888888,688666688,688666868,688666886,688666888,688668668,688668686,688668688,688668866,688668868,688668886,688686668,688686686,688686688,688686866,688686868,688686886,688688666,688688668,688688686,688688866,688688888,688866668,688866686,688866688,688866866,688866868,688866886,688868666,688868668,688868686,688868866,688868888,688886666,688886668,688886686,688886866,688886888,688888666,688888868,688888886,688888888,866666666,866666668,866666686,866666866,866668666,866668868,866668886,866686666,866686868,866686886,866688668,866688686,866688866,866688868,866688886,866866666,866866868,866866886,866868668,866868686,866868866,866868868,866868886,866886668,866886686,866886866,866886868,866886886,866888666,866888668,866888866,868666666,868666868,868666886,868668668,868668686,868668866,868668868,868686668,868686686,868686866,868686868,868686886,868688668,868688686,868688866,868866866,868866868,868866886,868868666,868868668,868868686,868868866,868886666,868886668,868886686,868886866,868888666,868888868,868888886,886666666,886666868,886666886,886668668,886668866,886668868,886668886,886686668,886686686,886686866,886686868,886686886,886688666,886688668,886688686,886688866,886866668,886866686,886866866,886866868,886866886,886868666,886868668,886868686,886868866,886886666,886886686,886886866,886888666,886888868,886888886,888666668,888666686,888666866,888666868,888666886,888668666,888668668,888668686,888668866,888686666,888686668,888686686,888686866,888688666,888688868,888688886,888866666,888866668,888866686,888866866,888868666,888868886,888886666,888886868,888886886,888888668,888888686,888888866,888888868,888888886,6666666668,6666666686,6666666688,6666666866,6666666868,6666666886,6666668666,6666668668,6666668686,6666668866,6666668888,6666686666,6666686668,6666686686,6666686866,6666686888,6666688666,6666688688,6666688868,6666688886,6666688888,6666866666,6666866686,6666866866,6666866888,6666868666,6666868688,6666868868,6666868886,6666868888,6666886666,6666886688,6666886868,6666886886,6666886888,6666888668,6666888686,6666888688,6666888866,6666888868,6666888886,6668666666,6668666668,6668666866,6668666888,6668668666,6668668688,6668668868,6668668886,6668668888,6668686666,6668686688,6668686868,6668686886,6668686888,6668688668,6668688686,6668688688,6668688866,6668688868,6668688886,6668866666,6668866868,6668866886,6668866888,6668868668,6668868686,6668868688,6668868866,6668868868,6668868886,6668886668,6668886686,6668886688,6668886866,6668886868,6668886886,6668888666,6668888668,6668888686,6668888866,6668888888,6686666666,6686666668,6686666686,6686666888,6686668666,6686668688,6686668868,6686668886,6686668888,6686686666,6686686688,6686686868,6686686886,6686686888,6686688668,6686688686,6686688688,6686688866,6686688868,6686688886,6686866666,6686866688,6686866886,6686866888,6686868668,6686868686,6686868688,6686868866,6686868868,6686868886,6686886668,6686886686,6686886688,6686886866,6686886868,6686886886,6686888666,6686888668,6686888686,6686888866,6686888888,6688666666,6688666688,6688666868,6688666888,6688668668,6688668686,6688668688,6688668866,6688668868,6688668886,6688686668,6688686686,6688686688,6688686866,6688686868,6688686886,6688688666,6688688668,6688688686,6688688866,6688688888,6688866668,6688866686,6688866688,6688866866,6688866868,6688866886,6688868666,6688868668,6688868686,6688868866,6688868888,6688886666,6688886668,6688886686,6688886866,6688886888,6688888666,6688888688,6688888868,6688888886,6688888888,6866666666,6866666668,6866666686,6866666866,6866666888,6866668688,6866668868,6866668886,6866668888,6866686666,6866686688,6866686868,6866686886,6866686888,6866688668,6866688686,6866688866,6866688868,6866688886,6866866666,6866866688,6866866868,6866866886,6866866888,6866868686,6866868688,6866868866,6866868868,6866868886,6866886668,6866886686,6866886688,6866886866,6866886868,6866886886,6866888666,6866888668,6866888686,6866888866,6866888888,6868666666,6868666688,6868666868,6868666886,6868666888,6868668668,6868668688,6868668866,6868668868,6868668886,6868686668,6868686686,6868686688,6868686866,6868686886,6868688666,6868688668,6868688686,6868688866,6868688888,6868866668,6868866686,6868866688,6868866866,6868866868,6868866886,6868868666,6868868668,6868868686,6868868866,6868868888,6868886666,6868886668,6868886686,6868886866,6868886888,6868888666,6868888688,6868888868,6868888886,6868888888,6886666666,6886666688,6886666868,6886666886,6886666888,6886668668,6886668686,6886668688,6886668868,6886668886,6886686668,6886686686,6886686688,6886686866,6886686868,6886686886,6886688666,6886688668,6886688686,6886688866,6886688888,6886866686,6886866688,6886866866,6886866868,6886866886,6886868666,6886868668,6886868686,6886868866,6886868888,6886886666,6886886668,6886886686,6886886866,6886886888,6886888666,6886888688,6886888868,6886888886,6886888888,6888666668,6888666686,6888666688,6888666866,6888666868,6888666886,6888668666,6888668686,6888668866,6888668888,6888686666,6888686668,6888686686,6888686866,6888686888,6888688666,6888688688,6888688868,6888688886,6888688888,6888866666,6888866668,6888866686,6888866866,6888868666,6888868688,6888868868,6888868886,6888886666,6888886688,6888886868,6888886886,6888886888,6888888668,6888888686,6888888688,6888888866,6888888868,6888888886,8666666666,8666666668,8666666686,8666666866,8666668666,8666668868,8666668886,8666686868,8666686886,8666688668,8666688686,8666688866,8666688868,8666688886,8666866666,8666866868,8666866886,8666868686,8666868866,8666868868,8666868886,8666886686,8666886866,8666886868,8666886886,8666888666,8666888668,8666888686,8666888866,8668666666,8668666868,8668666886,8668668668,8668668686,8668668866,8668668868,8668668886,8668686668,8668686866,8668686868,8668686886,8668688666,8668688668,8668688686,8668688866,8668866668,8668866686,8668866866,8668866868,8668866886,8668868666,8668868668,8668868686,8668868866,8668886666,8668886668,8668886686,8668886866,8668888868,8668888886,8686666666,8686666886,8686668668,8686668686,8686668866,8686668868,8686668886,8686686668,8686686686,8686686868,8686686886,8686688666,8686688668,8686688686,8686688866,8686866668,8686866686,8686866866,8686866868,8686866886,8686868666,8686868668,8686868866,8686886666,8686886668,8686886686,8686886866,8686888666,8686888868,8686888886,8688666668,8688666686,8688666866,8688666868,8688666886,8688668668,8688668686,8688668866,8688686666,8688686668,8688686686,8688686866,8688688666,8688688868,8688688886,8688866666,8688866686,8688866866,8688868666,8688868868,8688868886,8688886666,8688886868,8688886886,8688888668,8688888686,8688888866,8688888868,8688888886,8866666666,8866666868,8866666886,8866668668,8866668686,8866668866,8866668868,8866686686,8866686866,8866686868,8866686886,8866688668,8866688686,8866688866,8866866668,8866866866,8866866886,8866868666,8866868668,8866868686,8866868866,8866886666,8866886668,8866886686,8866886866,8866888666,8866888868,8866888886,8868666668,8868666686,8868666866,8868666868,8868666886,8868668668,8868668686,8868668866,8868686666,8868686668,8868686686,8868686866,8868688666,8868688868,8868688886,8868866666,8868866668,8868866686,8868866866,8868868666,8868868868,8868868886,8868886666,8868886868,8868886886,8868888668,8868888686,8868888866,8868888868,8868888886,8886666668,8886666686,8886666866,8886666868,8886666886,8886668666,8886668668,8886668686,8886668866,8886686666,8886686668,8886686686,8886686866,8886688666,8886688886,8886866666,8886866668,8886866686,8886866866,8886868666,8886868868,8886868886,8886886666,8886886868,8886886886,8886888686,8886888866,8886888886,8888666666,8888666668,8888666686,8888666866,8888668666,8888668868,8888668886,8888686666,8888686868,8888686886,8888688668,8888688686,8888688866,8888688868,8888866666,8888866868,8888866886,8888868686,8888868866,8888868868,8888868886,8888886668,8888886686,8888886866,8888886868,8888886886,8888888666,8888888686,8888888866};
ll table2[2000];
ll cnt2 = 0;
long maxm = sizeof(table)/sizeof(ll)-1;
ll cnt = 0;
ll M;


inline ll dfs(long p,ll sum)
{
    if (p == cnt2+1) return M/sum;
    ll res = 0;

    //GCD
    ll g = sum;
    ll bb = table2[p];
    while (bb)
    {
        ll t = g%bb;
        g = bb;
        bb = t;
    }
    res += dfs(p+1,sum);
    if (sum/g<=M/table2[p])
        res -= dfs(p+1,sum/g*table2[p]);
    return res;
}

int main()
{
    freopen("luckynumber.in","r",stdin);
    freopen("luckynumber.out","w",stdout);
    std::ios::sync_with_stdio(false);
    std::cin >> a >> b;
    //scanf("%lld%lld",&a,&b);
    long j;
    for (j=maxm;j>0;j--)
        if (table[j]<=b)break;
    if (table[j]<=b)
        for (long i=j;i>0;i--)
            table2[++cnt2]=table[i];
    M = b;
    ll ans1 = M - dfs(1,1);
    M = a-1;
    ll ans2 = M - dfs(1,1);
    std::cout << ans1-ans2;
    //printf("%lld",ans1-ans2);
    return 0;
}


你可能感兴趣的:(NOI)