• 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

  • 相关阅读:
    eclipse常用快捷键大全 (转)
    介绍 JSON (转)
    坐标转换原理
    直接线性变换解法(DLT)用于标定相机
    SuperMap(无对应字段)空间属性挂接
    Ubuntu16.04安装视觉SLAM环境(DBow3)
    Ubuntu16.04安装视觉SLAM环境(OpenCV)
    Oracle数据库学习(三):Oracle数据库的环境配置与安装
    Oracle数据库学习(四):学习中的遇到的问题
    Oracle数据库学习(一):虚拟机下Oracle Linux的安装与配置
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9748162.html
Copyright © 2020-2023  润新知