标签:geo void pac 容斥 max time 进制 for stdout
【数据范围】
对于30%的数据,保证1 < =a < =b < =1000000
对于100%的数据,保证1 < =a < =b < =10000000000
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=3005; 5 LL l,r,a[MAX],b[MAX],ans; 6 bool p[MAX]; 7 void get(LL x){ 8 if (x>r) return; 9 if (x) a[++a[0]]=x; 10 get(x*10+6),get(x*10+8); 11 } 12 LL gcd(LL x,LL y){return y==0?x:gcd(y,x%y);} 13 void dfs(LL x,LL y,LL lcm){ 14 if (x>b[0]){ 15 if (y&1) ans+=r/lcm-(l-1)/lcm; 16 else if (y) ans-=r/lcm-(l-1)/lcm; 17 return; 18 } 19 dfs(x+1,y,lcm); 20 LL g=gcd(b[x],lcm); 21 lcm/=g; 22 if (r/lcm<b[x]) return; 23 lcm*=b[x]; 24 dfs(x+1,y+1,lcm); 25 } 26 int main(){ 27 freopen ("lucky.in","r",stdin);freopen ("lucky.out","w",stdout); 28 int i,j; 29 scanf("%lld%lld",&l,&r); 30 get(0);sort(a+1,a+a[0]+1); 31 for (i=1;i<=a[0];i++) 32 if (!p[i]){ 33 b[++b[0]]=a[i]; 34 for (j=i+1;j<=a[0];j++) if (a[j]%a[i]==0) p[j]=true; 35 } 36 for (i=1;i<=b[0]/2;i++) swap(b[i],b[b[0]-i+1]); 37 dfs(1,0,1); 38 printf("%lld",ans); 39 return 0; 40 }
BZOJ-1853: [Scoi2010]幸运数字 (容斥原理)
标签:geo void pac 容斥 max time 进制 for stdout
原文地址:http://www.cnblogs.com/keximeiruguo/p/7784745.html