ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P2257 YY的GCD (莫比乌斯反演)

2019-02-17 09:41:06  阅读:297  来源: 互联网

标签:peng www ym GCD P2257 YY 枚举 luogu 式子


[题目链接] https://www.luogu.org/problemnew/show/P2257

// luogu-judger-enable-o2
/*
-----------------------
[题解]
https://www.luogu.org/blog/peng-ym/solution-p2257
[莫比乌斯反演]
http://www.cnblogs.com/peng-ym/p/8647856.html
[整除分块]
http://www.cnblogs.com/peng-ym/p/8661118.html
-----------------------
前置:莫比乌斯函数μ(x)为一次质因子的个数,其中μ(1)=1
化简式子中有几个地方很巧妙
1.设f(n)为gcd(i,j)=n的方案数,F(n)=∑{n|d}(f(d))=(N/n)*(M/n)
2.更换枚举项:由枚举 p 到枚举 (d/p) ,总之枚举 μ ,方便算前缀和
3.由枚举 dp 到枚举 T, 根据 μ(d) 有关计算从所有 d 的 p 倍的式子, 转化为根据 μ(T/t) 计算所有有关 T 的式子. 
4.程序实现时运用整除分块,即变量在[l,r]内代入式子算得结果一样
-----------------------
written by pengym.
-----------------------2019.2.11
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
    register LL x=0,f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
    while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
    return f*x;
}

const int MAXN=1e7+5;

int mu[MAXN],prime[MAXN],g[MAXN];
bool vis[MAXN];
LL sum[MAXN],ans;
int n,m,Pcnt,T;

inline void init(int n){
    mu[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            prime[++Pcnt]=i;
            mu[i]=-1;
        }
        for(int j=1;j<=Pcnt&&prime[j]*i<=n;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0) break;
            else mu[prime[j]*i]=-mu[i];
        }
    }
    prime[0]=1;
    for(int j=1;j<=Pcnt;j++)
        for(int i=0;i*prime[j]<=n;i++)
            g[i*prime[j]]+=mu[i];//对∑(μ)的计算
    for(int i=1;i<=n;i++)
        sum[i]=sum[i-1]+g[i];//前缀和
}

int main(){
    init(1e7);
    T=read();
    while(T--){
        n=read(),m=read();ans=0;
        if(n>m) swap(n,m);
        for(int l=1,r;l<=n;l=r+1){
            r=min(n/(n/l),m/(m/l));//变量在[l,r]内代入式子算得结果一样
            ans+=(LL)(n/l)*(m/l)*(sum[r]-sum[l-1]);
            //记得加(LL)!!!
        }
        printf("%lld\n",ans);
    }
}

标签:peng,www,ym,GCD,P2257,YY,枚举,luogu,式子
来源: https://www.cnblogs.com/lizehon/p/10390179.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有