• bzoj1853幸运数字


    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1853

    容斥原理的应用。

    发现十位的话只有2047个只含6或8的数,故可以存。它们的倍数个数只要到时候用边界除以一下就行了。

    但容斥原理是指数级别的。故剪枝:

      因为比 r 大的 lcm 就没用了。故若当前的累计lcm已经大于r,因为越乘越大,故直接剪掉。

      怎样考虑顺序才能使剪枝更有效呢?

      在每一层都有两种情况:选当前元素和不选当前元素。一直递归到序号大于n时更新答案并return;

      也就是排在前面的元素改一下,就把它后面的元素的种种状况都考虑完,之后再改一下这个前面的元素,再……

      若从小到大排序,则经过种种状态到达很后面一个位置时突然发现超过了r,于是回溯;这样会把“前面的种种状态”都遍历一遍,每次到了这儿回溯;

      但若从大到小排序,则原来的“前面的种种状态”变成了“后面的种种状态”,一旦在此return,就不会遍历后面了,剪枝变得更有效了。

      也就是值越大,越容易使累计的lcm越过r,所以把值大的放在前面,就可以使剪枝更有效。

      似乎因为很容易就越过r了,所以加了剪枝就可以轻松过了。

    小注意:lcm算出来的话似乎会爆long long,但可以用long long记在参数里。所以是先求一个tmp,再用double比较。(虽然double精度有点低)。

        但有一个很好的方法!就是不比较 a[k] * tmp <=r,而是比较 tmp <= r / a[k] !这样就肯定不会爆了~

    但:本代码中所有都是 l l。另有把计数的k,cnt之类写成int的(只有这一点区别),就RE了。真是不明所以。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    ll l,r,a[2100],b[2100],m,n,ans;
    bool er[2100];
    void pre(ll k)
    {
        if(k>r)return;
        a[++m]=k;
        pre(k*10+8);
        pre(k*10+6);
    }
    ll gcd(ll u,ll v)
    {
        return v==0?u:gcd(v,u%v);
    }
    void dfs(ll k,ll cnt,ll z)//第k号 选了cnt个元素 之前的lcm为z
    {
        if(k>n)
        {
            if(!cnt)return;        //////
            if(cnt&1)ans+=r/z-(l-1)/z;
            else ans-=r/z-(l-1)/z;
            return;
        }
        dfs(k+1,cnt,z);
        ll tmp=z/gcd(a[k],z);
        if((double)a[k]*tmp<=r)dfs(k+1,cnt+1,a[k]*tmp);
     } 
    int main()
    {
        scanf("%lld%lld",&l,&r);
        pre(6);pre(8);
        sort(a+1,a+m+1);
        for(ll i=1;i<=m;i++)
            if(!er[i])
            {
                for(ll j=i+1;j<=m;j++)
                    if(a[j]%a[i]==0)er[j]=1;
                b[++n]=a[i];
            }
        for(ll i=1;i<=n;i++)
            a[i]=b[n-i+1];
        dfs(1,0,1);            ///z=1
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    图像 resize 代码:保留 aspect ratio(长宽比)
    Pytorch lr_scheduler 中的 last_epoch 用法
    torch.optim用法(参数组的设置)
    课程式学习(Curriculum Learning)
    扇贝单词本-隐藏中文释义 tampermonkey
    电话号码正向标记认证网站申请地址
    考研英语做题计时器网页版(每隔3分钟播放声音,提醒计时)
    mac关闭自动更新后还在每天提醒进行安装更新
    mac 自动生成自签证书脚本
    Ditto
  • 原文地址:https://www.cnblogs.com/Narh/p/8526041.html
Copyright © 2020-2023  润新知