zoukankan      html  css  js  c++  java
  • 【BZOJ 3309】DZY Loves Math(莫比乌斯反演)

    传送门

    首先简单莫反后可以得到

    ans=TaTbTdTμ(d)f(Td)ans=sum_{T}frac a Tfrac b Tsum_{d|T}mu(d)f(frac{T}{d})
    =TaTbTg(T)=sum_{T}frac a Tfrac b T g(T)

    考虑怎么求gg
    一个显然的方法是nlognnlogn枚举,但是过不了

    考虑g(t)=dtf(d)μ(t/d)g(t)=sum_{d|t}f(d)mu(t/d)
    t=i=1kpibi,t/d=ipiait=prod_{i=1}^kp_i^{b_i},t/d=prod_{i}p_i^{a_i}
    由于μmu的性质,所以所有有贡献的t/dt/dai1a_ile 1

    那么此时f(d)=f(t)f(d)=f(t)f(t)1f(t)-1

    考虑当tt分解出的bib_i不是都相等时
    那么就一定存在某个aia_i的取值不影响ff
    但是由于对于μmu的贡献是+1/1+1/-1
    所以会恰好抵消

    而当bib_i都相等时

    除了当aia_i都为1时ff的值要少1
    如果不看这个ff少1的话和应该为0的
    所以减去这个差量也就是贡献为(1)k=(1)k+1-(-1)^k=(-1)^{k+1}

    所以只有t=(i=1kpi)rt=(prod_{i=1}^kp_i)^r
    g(t)=(1)k+1g(t)=(-1)^{k+1}
    否则g(t)=0g(t)=0

    这个东西可以线筛了
    利用线筛是用最小质因子筛,维护最小质因子的次数以及除去最小质因子后的值就可以了
    具体实现可以看代码

    #include<bits/stdc++.h>
    using namespace std;
    #define cs const
    #define re register
    #define pb push_back
    #define pii pair<int,int>
    #define fi first
    #define ll long long
    #define se second
    #define bg begin
    cs int RLEN=(1<<20)+1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ib==ob)?EOF:*ib++;
    }
    inline int read(){
        char ch=gc();
        int res=0;bool f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=res*10+(ch^48),ch=gc();
        return f?res:-res;
    }
    template<class tp>inline void chemx(tp&a,tp b){a<b?a=b:0;}
    template<class tp>inline void chemn(tp&a,tp b){a>b?a=b:0;}
    cs int N=10000007;
    int g[N],pw[N],ecp[N],pr[N/10+1];
    int tot;
    bitset<N> vis;
    inline void init(cs int len=N-7){
        for(int i=2;i<=len;i++){
            if(!vis[i])pr[++tot]=i,g[i]=pw[i]=ecp[i]=1;
            for(int j=1;j<=tot&&i*pr[j]<=len;j++){
                int p=i*pr[j];
                vis[p]=1;
                if(i%pr[j]==0){
                    ecp[p]=ecp[i];
                    pw[p]=pw[i]+1;
                    if(ecp[p]==1)g[p]=1;
                    else g[p]=(pw[ecp[p]]==pw[p])?-g[ecp[p]]:0;
                    break;
                }
                ecp[p]=i,pw[p]=1,g[p]=(pw[i]==1?-g[i]:0);
            }
        }
        for(int i=2;i<=len;i++)g[i]+=g[i-1];
    }
    int main(){
        #ifdef Stargazer
        freopen("lx.in","r",stdin);
        #endif
        init();
        int T=read();
        while(T--){
            int a=read(),b=read();
            ll ret=0;
            for(int l=min(a,b),i=1,nxt;i<=l;i=nxt+1){
                nxt=min(a/(a/i),b/(b/i));
                ret+=1ll*(a/i)*(b/i)*(g[nxt]-g[i-1]);
            }
            cout<<ret<<'
    ';
        }
    }
    
  • 相关阅读:
    解决maven update project 后项目jdk变成1.5的问题
    applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
    SQL0668N 不允许对表"xxx"执行操作,原因码为 "1"
    maven下的jar项目打包的方法
    spring security 4.2后出现CouldnotverifytheprovidedCSRFtokenbecauseyoursessionwasnotfound
    maven-javadoc-plugin 出现错误Unsupported major.minor version 51.0
    通过 Spring Security配置 解决X-Frame-Options deny 造成的页面空白 iframe调用问题
    yaml模块
    centos 下 yum安装python3
    Python 之ConfigParser模块
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/12328331.html
Copyright © 2011-2022 走看看