码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1853幸运数字——容斥原理

时间:2018-03-08 02:49:53      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:pos   题目   tin   www   color   stream   zoj   ref   namespace   

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

dfs实现容斥原理即可。

注意:若在init中写“cnt++”,则出来后需要先cnt--再继续!!

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll l,r,a[100005],b[100005],ans,cnt,ct;
bool del[100005];
void init(ll x)
{
    if(x>r)return;
    a[cnt++]=x;
    init(10*x+6);
    init(10*x+8);
}
ll gcd(ll x,ll y)
{
    return x%y==0?y:gcd(y,x%y);
}
void dfs(ll x,ll y,ll z)
{
    if(x>ct)
    {
        if(y&1)ans+=r/z-(l-1)/z;
        else if(y)ans-=r/z-(l-1)/z;
        return;
    }
    dfs(x+1,y,z);
    ll tmp=z/gcd(a[x],z);
    if((double)a[x]*tmp<=r)dfs(x+1,y+1,a[x]*tmp);
}
int main()
{
    scanf("%lld%lld",&l,&r);
    init(0);
    cnt--;//!!!
    sort(a+1,a+cnt+1);
    for(ll i=1;i<=cnt;i++)
    {
        if(del[i])continue;
        for(ll j=i+1;j<=cnt;j++)
            if(a[j]%a[i]==0)del[j]=1;
        b[++ct]=a[i];
    }
    for(ll i=1;i<=ct;i++)//倒序! 
        a[i]=b[ct-i+1];
    dfs(1,0,1);
    printf("%lld",ans);
    return 0;
}

 

bzoj1853幸运数字——容斥原理

标签:pos   题目   tin   www   color   stream   zoj   ref   namespace   

原文地址:https://www.cnblogs.com/Zinn/p/8526203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!