[SCOI2010]幸运数字

一开始以为是数位dp,但是想到什么68,688的倍数怎么求就懵了。。。但是发现只有10位,有1024个幸运数字,我们可以把这些数算出来,容斥原理做一下。

#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
long long l,r,a[10025],cnt,num,b[10025],ans;
bool vis[10025];
void pre(long long now) {
  if(now>r) return;
  a[++cnt]=now;
  pre(now*10+6);
  pre(now*10+8);
}
bool cmp(long long x,long long y){return x>y;}
void rongchi(int x,int y,long long z) {
  if(x>num) {
    if(y&1) ans+=r/z-(l-1)/z;
    else if(y)ans-=r/z-(l-1)/z;
    return;
  }
  long long c=b[x]*z/__gcd(b[x],z);
  rongchi(x+1,y,z);
  if(c<=r&&c>0)
  rongchi(x+1,y+1,c);
}
int main() {
    scanf("%lld%lld",&l,&r);
    pre(6);pre(8);
    sort(a+1,a+1+cnt);
    for(int i=1;i<=cnt;i++) {
      if(a[i]) {
        b[++num]=a[i];
        for(int j=i+1;j<=cnt;j++)
          if(a[j]%a[i]==0) a[j]=0;
      }
    }
    sort(b+1,b+1+num,cmp);
    rongchi(1,0,1);printf("%lld",ans);
}
posted @ 2018-07-27 07:21  SWHsz  阅读(163)  评论(0编辑  收藏  举报