• 51nod1244 莫比乌斯函数之和


     
    莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。具体定义如下:
    如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。
    如果一个数不包含平方因子,并且有k个不同的质因子,那么miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。
     
    给出一个区间[a,b],S(a,b) = miu(a) + miu(a + 1) + ...... miu(b)。
    例如:S(3, 10) = miu(3) + miu(4) + miu(5) + miu(6) + miu(7) + miu(8) + miu(9) + miu(10)
    = -1 + 0 + -1 + 1 + -1 + 0 + 0 + 1 = -1。
    Input
    输入包括两个数a, b,中间用空格分隔(2 <= a <= b <= 10^10)
    Output
    输出S(a, b)。
    Input示例
    3 10
    Output示例
    -1
    这个问题是一个积性函数的问题,结论是这个

    后面的玩意就是我们熟识的数论分块呀,其中l到r产生的贡献是一定的

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=5000005;
    bool is_p[N];
    int pri[N],mu[N];
    int tot;
    unordered_map<ll,ll>M;
    void init()
    {
        tot=0,mu[0]=0,mu[1]=1;
        for(int i=2; i<N; i++)
        {
            if(!is_p[i])pri[tot++]=i,mu[i]=-1;
            for(int j=0; j<tot&&pri[j]*i<N; j++)
            {
                is_p[pri[j]*i]=1;
                if(i%pri[j]==0)
                {
                    mu[i*pri[j]]=0;
                    break;
                }
                mu[i*pri[j]]=-mu[i];
            }
        }
        for(int i=1; i<N; i++) mu[i]+=mu[i-1];
    }
    ll cal(ll a)
    {
        if(a<N)return mu[a];
        if(M.count(a)) return M[a];
        ll ans=1;
        for(ll l=2,r; l<=a;l=r+1)
        {
            r=a/(a/l);
            ans-=cal(a/l)*(r-l+1);
        }
        M[a]=ans;
        return ans;
    }
    int main()
    {
        ll a,b;
        init();
        cin>>a>>b;
        cout<<cal(b)-cal(a-1)<<endl;
        return 0;
    }
  • 相关阅读:
    一家软件公司的笔试题
    利用jQuery实现多文件上传
    利用jquery实现内容回滚
    获取MS SQL库数据字典的经典SQL语句
    利用jQuery实现Gridview 选中行相关数据显示
    油气井是怎么打成的
    数据库问题小记(SQL 2000系列)
    利用jQuery实现GridView固定表头
    经典SQL语句
    jQuery改变GridView的样式
  • 原文地址:https://www.cnblogs.com/BobHuang/p/9700381.html
Copyright © 2020-2023  润新知