zoukankan      html  css  js  c++  java
  • 51Nod1192 Gcd表中的质数


    题目看这里
    又到了推式子的时候了,莫比乌斯反演入门题

    i=1nj=1m[prime(i,j)]

    首先搞一个f(d)表示有多少对(i,j)的gcd就是d
    那么原式=d=1n[prime(d)]f(d)
    F(x)=x|df(d)=[nx][mx]
    就得到原式=d=1n[prime(d)]iF(id)μ(i)
    =id<=nF(id)μ(i)[prime(d)]
    =T<=nF(T)prime(d)=1,d|Tμ(Td)
    预处理后面那个g(T)=prime(d)=1,d|Tμ(Td)就可以分块求答案了

    #pragma GCC optimize("O3")
    #pragma G++ optimize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 5000010
    #define LL long long
    using namespace std;
    bool vis[N];
    int mu[N],s[N],w[N>>2],t,n,m,T;
    inline LL F(int d){
        return (LL)(n/d)*(m/d);
    }
    inline void cal(){
        scanf("%d%d",&n,&m);
        if(n>m) swap(n,m); LL S=0;
        for(int i=1,j;i<=n;i=j+1){
            j=min(n/(n/i),m/(m/i));
            S+=F(i)*(s[j]-s[i-1]);
        }
        printf("%lld
    ",S);
    }
    int main(){
        mu[1]=1;
        for(int i=2;i<=5000000;++i){
            if(!vis[i]) mu[w[++t]=i]=-1;
            for(int j=1,k;j<=t && (k=i*w[j])<=5000000;++j){
                vis[k]=1;
                if(i%w[j]==0) { mu[k]=0; break; } else mu[k]=-mu[i];
            }
        }
        for(int i=1;i<=t;++i)
            for(int j=w[i],k=1;j<=5000000;++k,j+=w[i]) s[j]+=mu[k];
        for(int i=1;i<=5000000;++i) s[i]+=s[i-1];
        for(scanf("%d",&T);T--;cal());
    }
  • 相关阅读:
    Shiro基础
    Nginx+tomcat集群使用redis共享session
    小程序 wepy wx.createAnimation 向右滑动渐入渐出
    小程序util工具
    记错本~~
    小程序BindTap快速连续点击页面跳转多次
    微信小程序页面无法跳转
    CSS:font-family常用字体中英文对照
    git 常用指令
    js 获取数组重复的元素
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477071.html
Copyright © 2011-2022 走看看