[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);
}
我是咸鱼。转载博客请征得博主同意Orz