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

[题目链接] 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);
    }
}

原文地址:https://www.cnblogs.com/lizehon/p/10390179.html

时间: 2024-08-30 01:55:44

P2257 YY的GCD (莫比乌斯反演)的相关文章

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

题意:求\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = prim]\] 题解:那就开始化式子吧!! \[f(d) = \sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = d]\] \[F(x) = \sum_{d|x} f(d) = \left \lfloor \frac{n}{x} \right \rfloor \left \lfloor \frac{m}{x} \right \rfloor\] \[f(d) = \sum_{d|

BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discuss] Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必然不会了,于是向你来请教……多组输入 Input 第一行一个整数T 表述数据组数接下来T行,每行两个正

bzoj 2820 luogu 2257 yy的gcd (莫比乌斯反演)

题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便表述,由于n和m等价,以下内容均默认n<=m 题目让我们求:$\sum_{k=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]$ 容易变形为:$\sum_{k=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{k} \righ

bzoj 2820 YY的GCD 莫比乌斯反演

题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性筛的时候只考虑当前的数最小因子,如果进来的最小因子不存在,相当于在之前那个数的基础上的每个mu值都多加了一个质数,那么 这些mu值就要取反,如果已经包含了这个最小因子,我这里另外进行了跟之前类似的讨论方法,在代码中写着 因为这题目数据比较大,这里求解的时候不应该线性求,因为总是有一段区间的n/i*(m/i)值

【BZOJ2820】YY的GCD [莫比乌斯反演]

YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对k. Input 第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M. Output T行,每行一个整数表示第 i 组数据的结果 Sample Input 2 10 10 100 100 Sample Output

BZOJ2820 YY的GCD 莫比乌斯反演

题意:求x∈[1,N],y∈[1,M]中gcd(x,y)为质数的数对的数量. 题解: 这个题把BZOJ2301中的k改成枚举素数就能过啦……才怪,不过和那个题的思路类似,但我们不枚举每一个质数,而是直接枚举质数p的倍数T,得到\[{f_{A,B,p}} = \sum\limits_{p|T} {[{F_{A,B,T}}\sum\limits_{p|T} {\mu (\frac{T}{p})} ]} \]其中F,f的定义与2301中的相同,而分块的时候求和需要预处理出来后面那个和式,稍微修改一下线

BZOJ 2820 YY的GCD ——莫比乌斯反演

我们可以枚举每一个质数,那么答案就是 $\sum_{p}\sum_{d<=n}\mu(d)*\lfloor n / pd \rfloor *\lfloor m / pd \rfloor$ 直接做?TLE 考虑优化,由于看到了pd是成对出现的,令T=pd $ans=\sum_{T<=min(n,m)}\lfloor n / T \rfloor *\lfloor m / T \rfloor \sum_{p \mid T}\mu(T/p)$ 或者 $ans=\sum_{T<=min(n,m)}

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

P2257 YY的GCD luogu题解第一篇非常棒,当然你也可以point here(转) 正题因为题解写的太优秀所以没得补充 这里用了一个卡常技巧:循环展开 就是以代码长度为代价减少循环次数 实测快了15ms(一个点1.5ms....) (用了快读更慢???(大雾)但是register真有用) #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #define re

P2257 YY的GCD

P2257 YY的GCD 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 输入输出格式 输入格式: 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示N, M 输出格式: T行,每行一个整数表示第i组数据的结果 输入输出样例 输入样例#1: 复制 2 10 10 100 100 输出样例#1: 复制 30 2791