zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793634.html
Copyright © 2011-2022 走看看