10.06 容斥练习T3 简单容斥+去重搜索

Description

~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~
现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~
但是Cirno这么天才的妖精才不屑去数啦
只能依靠聪明的你咯。

Input

一行正整数L R( 1 < L < R < 10^10)

Output

一个正整数,代表所求的答案

Sample Input

1 100

Sample Output

58
 
 
 
与之前的SCOI的幸运数字其实是一个道理,就是预处理出所有2,9相关的数字,然后吧这些数字去重之后放进去跑(如果不去重会相当的恐怖,18000+个去重后446个)搜索
搜索非常普通,注意往后转移的时候是lcm,其他的参见幸运数字(一次就过了好少见)
code:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define N 100005
 5 using namespace std;
 6 long long ans,a[N],l,r,tot,check[N];
 7 void pre(long long dep,long long val){
 8 //    cout<<val<<endl;
 9 //    system("pause");
10     if(dep==9){
11         if(!val)return;
12         a[++tot]=val;
13         return;
14     }
15     pre(dep+1,val*10+2);
16     pre(dep+1,val*10+9);
17     pre(dep+1,val);
18 }
19 void uni(){
20     sort(a+1,a+tot+1);
21     tot=unique(a+1,a+tot+1)-a-1;
22     long long temp=0;
23     long long b[20000];
24     for(long long i=1;i<=tot;i++)b[i]=a[i];
25     for(long long i=1;i<=tot;i++){
26         if(check[i])continue;
27         a[++temp]=b[i];
28         for(long long j=i+1;j<=tot;j++){
29             if(b[j]%b[i])continue;
30             check[j]=1;
31         }    
32     }
33     tot=temp;
34     return;
35 }
36 long long gcd(long long a,long long b){
37     if(a<b)swap(a,b);
38     while(a=a%b)swap(a,b);
39     return b;
40 }
41 long long lcm(long long a,long long b){
42     return a/gcd(a,b)*b;
43 }
44 void dfs(long long dep,long long val,int now){
45     if(val>r)return;
46     if(dep==tot){
47         if(val==1)return;
48     //    cout<<val<<endl;
49         if(now%2==1)
50             ans+=r/val-(l-1)/val;    
51         else
52             ans-=r/val-(l-1)/val;
53         return ;
54     }
55     dfs(dep+1,lcm(val,a[dep+1]),now+1);
56     dfs(dep+1,val,now);
57 }
58 int main(){
59     pre(0,0);
60     uni();
61 //    for(int i=1;i<=tot;i++){
62 //        cout<<a[i]<<endl;
63 //        if(i%100==0)
64 //        system("pause");
65 //    }
66     cin>>l>>r;
67     dfs(0,1,0);
68     cout<<ans;
69     return 0;
70 }

over

原文地址:https://www.cnblogs.com/saionjisekai/p/9748162.html