標籤:去重 tle script ++ 答案 rip class stream 注意
Description~Cirno發現了一種baka數,這種數呢~只含有2和⑨兩種數字~~
現在Cirno想知道~一個區間中~~有多少個數能被baka數整除~
但是Cirno這麼天才的妖精才不屑去數啦
只能依靠聰明的你咯。Input一行正整數L R( 1 < L < R < 10^10)Output一個正整數,代表所求的答案Sample Input1 100Sample Output58 與之前的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 else52 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 簡單容斥+去重搜尋