点此看题面

大致题意: 求\(\sum_{x=1}^N\sum_{y=1}^MIsPrime(gcd(x,y))\)。

莫比乌斯反演

听说此题是莫比乌斯反演入门题?

一些定义

首先,我们可以定义\(f(d)\)和\(F(d)\)如下:

\[f(d)=\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)==d]
\]

\[F(d)=\sum_{i=1}^N\sum_{j=1}^M[d|gcd(i,j)]
\]

通过定义,不难发现:

\[F(n)=\sum_{n|d}f(d)=\lfloor\frac Nn\rfloor\lfloor\frac Mn\rfloor
\]

由于莫比乌斯反演的某些性质,我们又可以得到:

\[f(n)=\sum_{n|d}\mu(\lfloor\frac dn\rfloor)F(d)
\]

公式化简

首先,我们应该不难想到:

\[answer=\sum_{IsPrime(p)}\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)==p]
\]

然后就是一波化简。

应该挺容易看出,由于\(f(p)\)的定义,上面的式子其实就相当于下面这个式子:

\[answer=\sum_{IsPrime(p)}f(p)
\]

然后是莫比乌斯反演

\[answer=\sum_{IsPrime(p)}\sum_{p|d}\mu(\lfloor\frac dp\rfloor)F(d)
\]

但是,这样有点难以处理。

于是,我们改成枚举\(\lfloor\frac dp\rfloor\),于是原式就变成了这样:

\[answer=\sum_{IsPrime(p)}\sum_{d=1}^{min(\lfloor\frac Np\rfloor,\lfloor\frac Mp\rfloor)}\mu(d)F(d·p)
\]

将\(F(n)=\lfloor\frac Nn\rfloor\lfloor\frac Mn\rfloor\)代入进一步化简,可以得到:

\[answer=\sum_{IsPrime(p)}\sum_{d=1}^{min(\lfloor\frac Np\rfloor,\lfloor\frac Mp\rfloor)}\mu(d)\lfloor\frac N{d·p}\rfloor\lfloor\frac M{d·p}\rfloor
\]

如果我们用\(G\)来表示\(d·p\),则\(d=\frac Gp\),原式就变成了这个样子:

\[answer=\sum_{G=1}^{min(N,M)}\sum_{IsPrime(p),p|G}\mu(\frac Gp)\lfloor\frac NG\rfloor\lfloor\frac MG\rfloor
\]

通过乘法交换律乘法结合律,我们可以再一步转化,得:

\[answer=\sum_{G=1}^{min(N,M)}\lfloor\frac NG\rfloor\lfloor\frac MG\rfloor(\sum_{IsPrime(p),p|G}\mu(\frac Gp))
\]

然后就可以\(O(n)\)求解了。

\(But\),多组数据,\(T\le 10000\)... ...

求解答案

首先,我们用定义一个\(g(n)\),它的定义如下:

\[g(n)=\sum_{IsPrime(p),p|n}\mu(\frac np)
\]

于是,我们便能将上面的式子进一步转化:

\[answer=\sum_{G=1}^{min(N,M)}\lfloor\frac NG\rfloor\lfloor\frac MG\rfloor g(n)
\]

然后,我们可以用除法分块

不难发现,在一定范围内\(\lfloor\frac Ni\rfloor\)的值是保持不变的(\(\lfloor\frac Mi\rfloor\)同理),则\(\lfloor\frac NG\rfloor\lfloor\frac MG\rfloor\)其实最多只有\(\sqrt N+\sqrt M\),而对于\(\lfloor\frac NG\rfloor\lfloor\frac MG\rfloor\)相同的值,我们可以一起求解,于是就能想到用\(sum_i\)来表示\(\sum_{i=1}^i g(i)\),这样就能快速求解了。

代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
#define ten(x) (((x)<<3)+((x)<<1))
#define N 10000000
using namespace std;
int n,m;
class FIO
{
private:
#define Fsize 100000
#define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
#define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize];
public:
FIO() {FinNow=FinEnd=Fin;}
inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=ten(x)+(ch&15),isdigit(ch=tc()));x*=f;}
inline void read_char(char &x) {while(isspace(x=tc()));}
inline void read_string(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!~ch) return;}
inline void write(LL x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;}
inline void write_char(char x) {pc(x);}
inline void write_string(string x) {register int i,len=x.length();for(i=0;i<len;++i) pc(x[i]);}
inline void end() {fwrite(Fout,1,FoutSize,stdout);}
}F;
class Class_Mobius//莫比乌斯反演
{
private:
int Prime_cnt,mu[N+5],Prime[N+5];bool IsNotPrime[N+5];
public:
LL sum[N+5];
Class_Mobius()//预处理
{
register int i,j;
for(mu[1]=1,i=2;i<=N;++i)//求出莫比乌斯函数
{
if(!IsNotPrime[i]) Prime[++Prime_cnt]=i,mu[i]=-1;
for(j=1;j<=Prime_cnt&&i*Prime[j]<=N;++j)
if(IsNotPrime[i*Prime[j]]=true,i%Prime[j]) mu[i*Prime[j]]=-mu[i];else break;
}
for(j=1;j<=Prime_cnt;++j) for(i=Prime[j];i<=N;i+=Prime[j]) sum[i]+=mu[i/Prime[j]];//计算g(i)
for(i=1;i<=N;++i) sum[i]+=sum[i-1];//求前缀和
}
}Mobius;
int main()
{
register int i,nxt,T;register LL ans;F.read(T);
while(T--)
{
if(F.read(n),F.read(m),n>m) swap(n,m);
for(ans=0,i=1;i<=n;i=nxt+1) nxt=min(n/(n/i),m/(m/i)),ans+=1LL*(n/i)*(m/i)*(Mobius.sum[nxt]-Mobius.sum[i-1]);//除法分块
F.write(ans),F.write_char('\n');//输出答案
}
return F.end(),0;
}

【洛谷2257】YY的GCD(莫比乌斯反演)的更多相关文章

  1. 洛谷P2257 YY的GCD 莫比乌斯反演

    原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...

  2. 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块

    https://www.luogu.org/problemnew/show/P2257 求 \(n,m\) 中 \(gcd(i,j)==p\) 的数对的个数 求 $\sum\limits_p \sum ...

  3. 解题:洛谷2257 YY的GCD

    题面 初见莫比乌斯反演 有一个套路是关于GCD的反演经常设$f(d)=\sum_{gcd(i,j)==d},g(d)=\sum_{d|gcd(i,j)}$,然后推推推 $\sum\limits_{i= ...

  4. 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}次询问 莫比乌斯反演入门题 为方便 ...

  5. [洛谷2257]YY的GCD 题解

    整理题目转化为数学语言 题目要我们求: \[\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)=p]\] 其中 \[p\in\text{质数集合}\] 这样表示显然不是很好,所以我们需 ...

  6. 洛谷 2257 - YY的GCD

    莫比乌斯反演半模板题 很容易可以得到 \[Ans = \sum\limits_{p \in prime} \sum\limits_{d = 1}^{\min (\left\lfloor\frac{a} ...

  7. 洛谷 P2257 YY的GCD

    洛谷 P2257 YY的GCD \(solution:\) 这道题完全跟[POI2007]ZAP-Queries (莫比乌斯反演+整除分块) 用的一个套路. 我们可以列出答案就是要我们求: \(ans ...

  8. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

  9. 洛谷P2257 YY的GCD(莫比乌斯反演)

    传送门 原来……莫比乌斯反演是这么用的啊……(虽然仍然不是很明白) 首先,题目所求如下$$\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=prim]$$ 我们设$f(d)$表示$g ...

  10. 洛谷 P2257 - YY的GCD(莫比乌斯反演+整除分块)

    题面传送门 题意: 求满足 \(1 \leq x \leq n\),\(1 \leq y \leq m\),\(\gcd(x,y)\) 为质数的数对 \((x,y)\) 的个数. \(T\) 组询问. ...

随机推荐

  1. UPC11073(DP,思维)

    #include<bits/stdc++.h>using namespace std;long long dp[507][507];const long long mod = 998244 ...

  2. 深入理解C/C++ [Deep C (and C++)]

    编程是困难的,正确的使用C/C++编程尤其困难.确实,不管是C还是C++,很难看到那种良好定义并且编写规范的代码.为什么专业的程序员写出这样的代码?因为绝大部分程序员都没有深刻的理解他们所使用的语言. ...

  3. [Xcode 实际操作]五、使用表格-(4)设置UITableView单元格数据库源

    目录:[Swift]Xcode实际操作 本文将演示如何自定义表格的数据来源. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先添加 ...

  4. Ryzen 移动平台上安装 Gentoo Linux

    Linux 内核对于跟进支持 Ryzen 移动低压 CPU 的热情似乎和市面上寥寥无几的 Ryzen 笔记本热度十分吻合.虽然从 Linux 4.11 起就对 Ryzen 桌面 CPU 有较好的支持, ...

  5. 原生 Ajax 封装 和 Axios 二次 封装

    AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...

  6. angular学习笔记【ng2-charts】插件添加

    原文:https://segmentfault.com/a/1190000008077830 1. 安装 ng2-charts npm install ng2-charts --save2. 还必须引 ...

  7. little w and Sum(思维)

    链接:https://ac.nowcoder.com/acm/contest/297/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  8. Codeforces Round #363 (Div. 2) B

    Description You are given a description of a depot. It is a rectangular checkered field of n × m siz ...

  9. Unity Gizmos可视化辅助工具

    所有gizmo绘制需要在脚本的OnDrawGizmos或OnDrawGizmosSelected里函数完成. OnDrawGizmos在每帧调用.所有在OnDrawGizmos中渲染的gizmos都是 ...

  10. 交换函数swap的三种实现方法

    http://blog.csdn.net/GarfieldEr007/article/details/48314295 本文采用三种方式实现两个数之间的交换,分别是①借助辅助变量temp的swap函数 ...