10.06 容斥练习T3 简单容斥+去重搜索
Posted saionjisekai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.06 容斥练习T3 简单容斥+去重搜索相关的知识,希望对你有一定的参考价值。
Description
~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~
现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~
但是Cirno这么天才的妖精才不屑去数啦
只能依靠聪明的你咯。
现在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
以上是关于10.06 容斥练习T3 简单容斥+去重搜索的主要内容,如果未能解决你的问题,请参考以下文章