bzoj1853: [Scoi2010]幸运数字
Posted invoid
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1853: [Scoi2010]幸运数字相关的知识,希望对你有一定的参考价值。
容斥原理。
先求出所有只含6和8而且不是其他数的倍数的数。
然后进行容斥dfs,小心爆long long。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; const int maxn = 30000 + 10; LL a,b,cnt,n; LL lucky[maxn]; bool flag[maxn]; void build(LL n) { if(n>b) return; if(n) lucky[++cnt]=n; build(n*10+6); build(n*10+8); } bool cmp(LL a,LL b) { return a>b; } void predo() { cnt=n=0; build(0); sort(lucky+1,lucky+cnt+1,cmp); for(int i=1;i<=cnt;i++) { flag[i]=true; for(int j=cnt;j>i;j--) if(lucky[i]%lucky[j]==0) flag[i]=false; } for(int i=1;i<=cnt;i++) if(flag[i]) lucky[++n]=lucky[i]; } LL gcd(LL a,LL b) { return b==0?a:gcd(b,a%b); } LL dfs(int dep,LL cur) { //printf("%d %lld\n",dep,cur); if(dep>n) return b/cur-a/cur; LL res=dfs(dep+1,cur),g=gcd(cur,lucky[dep]); if(cur/g<=b/lucky[dep]) res-=dfs(dep+1,cur/g*lucky[dep]); return res; } int main() { scanf("%lld%lld",&a,&b); a--; predo(); printf("%lld\n",b-a-dfs(1,1)); return 0; }
以上是关于bzoj1853: [Scoi2010]幸运数字的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ-1853: [Scoi2010]幸运数字 (容斥原理)