1. 程式人生 > >bzoj1853幸運數字——容斥原理

bzoj1853幸運數字——容斥原理

typedef else stream http 繼續 -i targe ans nbsp

題目: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幸運數字——容斥原理