zoukankan      html  css  js  c++  java
  • bzoj2820(莫比乌斯反演)

    一个非常好的题解的地址:https://www.cnblogs.com/candy99/p/6209609.html;

    关于“否则考虑mu(i*p[j]/pp),p[j]!=pp时的所有的和就是-g(i),所以总的结果为mu(i)-g(i)”,为什么是-g(i),我们可以分类一下,考虑原来所有的情况都乘上一个i原来不包含的质数p,

    mu(i)=0,说明有和p[j]无关的次数大于1的素因子,那么加上p[j]后mu还为0。

    mu(i)=1或-1,说明没有次数大于1的素因子,加一个之后mu取反。

    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    typedef long long ll;
    const int maxn=10000005;
    int read(){
        int f=1,x=0;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int T,n,m,p[maxn],mu[maxn],g[maxn],vis[maxn];
    void pre(){
        mu[1]=1;
        for(int i=2;i<maxn;++i){
            if(!vis[i])p[++p[0]]=i,mu[i]=-1,g[i]=1;
            for(int j=1;j<=p[0]&&i*p[j]<maxn;++j){
                vis[i*p[j]]=1;
                if(i%p[j]==0){
                    mu[i*p[j]]=0;
                    g[i*p[j]]=mu[i];
                    break;
                }
                mu[i*p[j]]=-mu[i];
                g[i*p[j]]=mu[i]-g[i];
            }
        }
        for(int i=1;i<maxn;++i)g[i]+=g[i-1];
    }
    ll calc(int n,int m){
        if(n>m)swap(n,m);
        ll res=0;int r;
        for(int i=1;i<=n;i=r+1){
            r=min(n/(n/i),m/(m/i));
            res+=(ll)(g[r]-g[i-1])*(n/i)*(m/i);
        }
        return res;
    }
    int main(){
        pre();
        T=read();
        while(T--){
            n=read();m=read();
            printf("%lld
    ",calc(n,m));
        }
        system("pause");
        return 0;
    }
  • 相关阅读:
    JS Ajax跨域访问
    CentOS 6.8 Java 环境搭建
    vue+vant ui+高德地图的选址组件
    vue和element全局loading
    axios简单的二次封装
    vuex的简单教程
    vue 使用 element ui动态添加表单
    Promise对象和async函数
    css不定高图文垂直居中的三种方法
    js点击复制文本
  • 原文地址:https://www.cnblogs.com/dibaotianxing/p/8325247.html
Copyright © 2011-2022 走看看