• 【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

    Sol

    这题刚看上去似乎是个数位dp...不过是假的...

    首先幸运数字只有(2^{11})个,我们可以暴力找到它们,然后暴力去掉倍数。

    然后我们考虑近似幸运号码,我们发现如果把每个幸运数字的倍数都标记的话,每个数字的标记次数好像是和组成lcm的幸运数字个数有关的(说白了就是容斥),所以我们每次取几个幸运数字,求lcm,然后大力按照选择数字的个数判断系数容斥一波,算区间某个数的倍数出现次数当然是直接用(((r/x)-((l-1)/x)))算啦。

    到这里这道题好像就完了......但是dfs的时候注意一下,lcm好像是会爆long long的,我们用long double判断某个数字有没有越界,越界了就不搜这个数字了。

    还有,一定要倒着搜,这样的话状态少!!!否则会TLE!!!

    时间复杂度(能过O(能过))

    Code

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll l,r,n,vis[10005],a[10005],tot=-1,ans;
    void get(ll x){if(x>r) return;a[++tot]=x;get(x*10+6);get(x*10+8);}
    void dfs(int now,int cnt,ll x)
    {
    	if(now>n){if(!cnt) return;ans+=((cnt&1)?1:-1)*((r/x)-((l-1)/x));return;}
    	dfs(now+1,cnt,x);
    	ll tmp=x/__gcd(a[now],x);
    	if((long double)tmp*a[now]<=r) dfs(now+1,cnt+1,tmp*a[now]);
    }
    int main()
    {
    	scanf("%lld%lld",&l,&r);get(0);sort(a+1,a+tot+1);
    	for(int i=1;i<=tot;i++) for(int j=i+1;j<=tot;j++) if(a[j]%a[i]==0) vis[j]=1;
    	for(int i=1;i<=tot;i++) if(!vis[i]) a[++n]=a[i];
    	for(int i=1,j=n;i<j;i++,j--) swap(a[i],a[j]);
    	dfs(1,0,1);printf("%lld
    ",ans);
    }
    
  • 相关阅读:
    对MVC模式与MVVM模式的认识
    优雅降级和渐进增强
    入园第一天
    看看AQS阻塞队列和条件队列
    简单看看LockSupport和AQS
    简单看看LongAccumulator
    JUC中的原子操作类及其原理
    java并发基础知识
    简单看看es6解构赋值
    简单使用vue-cli
  • 原文地址:https://www.cnblogs.com/CK6100LGEV2/p/9416159.html
Copyright © 2020-2023  润新知