• 【51Nod1244】莫比乌斯函数之和-杜教筛+哈希表


    测试地址:莫比乌斯函数之和
    做法:这题需要使用杜教筛+哈希表。
    以下方括号[]表示若括号内式子为真,则该符号值为1,否则值为0
    首先我们设莫比乌斯函数前n项的和为f(n),即f(n)=ni=1μ(i),那么我们只需求f(b)f(a1)。使用d|nμ(d)=[n=1]来作进一步推导,我们可以先找到函数e(n)=[n=1]的前缀和,显然ni=1e(i)=1,那么ni=1d|iμ(d)=1,所以:

    i=1nd=1niμ(d)=i=1nf(ni)=1

    f(n)那项提出来,得到:
    f(n)=1i=2nf(ni)

    因为ni只有O(N)种取值,所以分块计算,需要用到的f值再递归计算,可以证明这个算法的时间复杂度是O(N34)
    然而我们还可以优化一下:我们发现一些比较小的f(n)值可以预处理出来,最好预处理出前N23项,据说这样时间可以优化到O(N23)。而且在计算f的时候,发现有些函数值被重复计算了,那么我们可以写个哈希表判个重就可以优化掉这些时间了。
    以下是本人代码(25个测试点TLE了1个点,有待继续学习):

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define ll long long
    #define limit 1000000
    #define mod 7500000
    using namespace std;
    ll a,b,h[mod+5]={0};
    int miu[limit+5],sum[limit+5],f[mod+5];
    bool prime[limit+5]={0};
    
    int hash(ll x)
    {
      int s=x%mod;
      while(h[s]&&h[s]!=x) s=(s+1)%mod;
      return s;
    }
    
    void calc_miu(ll x)
    {
      for(int i=1;i<=x;i++)
        miu[i]=1;
      for(ll i=2;i<=x;i++)
        if (!prime[i])
        {
          for(ll j=1;j*i<=x;j++)
          {
            prime[i*j]=1;
            if (!(j%i)) miu[i*j]=0;
            miu[i*j]*=-1;
          }
        }
      sum[0]=0;
      for(int i=1;i<=x;i++) sum[i]=sum[i-1]+miu[i];
    }
    
    ll count(ll x)
    {
      int pos=hash(x);
      if (x<=limit) return (ll)sum[x];
      if (h[pos]==x) return f[pos];
      ll s=0,i=2,next;
      while(i<=x)
      {
        next=x/(x/i);
        s+=(next-i+1)*count(x/i);
        i=next+1;
      }
      h[pos]=x,f[pos]=1-s;
      return 1-s;
    }
    
    int main()
    {
      calc_miu(limit);
      scanf("%lld%lld",&a,&b);
      printf("%lld",count(b)-count(a-1));
    
      return 0;
    }
    
  • 相关阅读:
    手把手教你接入微信支付
    Java中的深浅拷贝问题,你清楚吗?
    DeimosC2 源码阅读
    一行命令删除空的docker images
    docker build出现交互式时区设置解决
    Amass项目源码阅读(整体架构)
    Prometheus时序数据库-磁盘中的存储结构
    Prometheus时序数据库-内存中的存储结构
    解Bug之路-ZooKeeper集群拒绝服务
    日常Bug排查-Nginx重复请求?
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793633.html
Copyright © 2020-2023  润新知