Bzoj 2393: Cirno的完美算数教室 容斥原理,深搜
2393: Cirno的完美算数教室
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 287 Solved: 175
[Submit][Status][Discuss]
Description
~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~
现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~
但是Cirno这么天才的妖精才不屑去数啦
只能依靠聪明的你咯。
Input
一行正整数L R
( 1 < L < R < 10^10)
Output
一个正整数,代表所求的答案
Sample Input
1 100
Sample Output
58
HINT
Source
题解:
容斥原理+爆搜。
从大到小搜常数会变小 QAQ
话说“Cirno的完美算数教室”是什么鬼。。。233。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL unsigned long long 4 #define MAXN 1100 5 LL cc[MAXN],L,R,lc,sum; 6 bool vis[MAXN]; 7 LL read() 8 { 9 LL s=0,fh=1;char ch=getchar(); 10 while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();} 11 while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();} 12 return s*fh; 13 } 14 LL Gcd(LL aa,LL bb){if(bb==0)return aa;else return Gcd(bb,aa%bb);} 15 void dfs(LL k) 16 { 17 if(k>R)return; 18 if(k>0)cc[++lc]=k; 19 dfs(k*10+2); 20 dfs(k*10+9); 21 } 22 void dfs(LL ii,LL x,LL y,LL gs,LL lcm) 23 { 24 LL i,LCM; 25 if(x<lcm&&y<lcm)return; 26 if(gs>0) 27 { 28 if(gs%2!=0)sum+=((LL)(y/lcm)-(LL)(x/lcm)); 29 else sum-=((LL)(y/lcm)-(LL)(x/lcm)); 30 } 31 if((ii+1)>lc)return; 32 for(i=ii+1;i<=lc;i++) 33 { 34 if(vis[i]==false) 35 { 36 vis[i]=true; 37 LCM=lcm; 38 lcm=(lcm*cc[i])/Gcd(lcm,cc[i]); 39 if(gs==0)lcm=cc[i]; 40 dfs(i,x,y,gs+1,lcm); 41 lcm=LCM; 42 vis[i]=false; 43 } 44 } 45 } 46 LL calc(LL L,LL R) 47 { 48 sum=0; 49 memset(vis,false,sizeof(vis)); 50 dfs(0,L-1,R,0,1); 51 return sum; 52 } 53 int main() 54 { 55 LL len,i; 56 L=read();R=read(); 57 lc=0; 58 dfs(0); 59 sort(cc+1,cc+lc+1); 60 len=unique(cc+1,cc+lc+1)-(cc+1); 61 lc=len; 62 for(i=1;i<=lc/2;i++)swap(cc[i],cc[lc-i+1]); 63 printf("%lld",calc(L,R)); 64 return 0; 65 }