Bzoj 2393: Cirno的完美算数教室 容斥原理,深搜

2393: Cirno的完美算数教室

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 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 }

 

 
posted @ 2016-03-25 00:18  微弱的世界  阅读(186)  评论(0编辑  收藏  举报