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

我们的答案显然是

\[ans=\sum_{p\in prime}f(p)
\]

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

即有多少个数对的最大公约数是\(n\)的倍数

显然\(F(n)=\left \lfloor \frac{N}{n} \right \rfloor\times\left \lfloor \frac{M}{n} \right \rfloor\)

同时还存在

\[F(n)=\sum_{n|d}f(d)
\]

看起来并不能反演,但是我们大胆猜测会存在这样的性质

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

看起来很靠谱啊,那就证明一下吧

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

考虑把\(f(i)\)提前,因为\(n|d,d|i\),所以\(n|i\)

\[\sum_{n|d}\mu(\frac{d}{n})\sum_{d|i}f(i)=\sum_{n|i}f(i)\sum_{d|i,n|d}\mu(\frac{d}{n})
\]

设\(d=kn,i=cd\),则有\(i=ckn\)

则\(\frac{d}{n}=k,\frac{i}{n}=ck\),所以其实是在\(\frac{i}{n}\)的约数

所以可以写成

\[\sum_{n|i}f(i)\sum_{d|i,n|d}\mu(\frac{d}{n})=\sum_{n|i}f(i)\sum_{d|\frac{i}{n}}\mu(d)
\]

所以只有在\(i=n\)的时候\(\sum_{d|\frac{i}{n}}\mu(d)=1\),所以这个柿子的值是成立的

所以有一种新的反演形式

\[F(n)=\sum_{n|d}f(d)
\]

就有

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

之后我们的柿子变成了

\[ans=\sum_{p\in prime}\sum_{n|p}\mu(\frac{p}{n})F(n)=\sum_{p\in prime}\sum_{n|p}\mu(\frac{p}{n})\times \left \lfloor \frac{N}{n} \right \rfloor\times\left \lfloor \frac{M}{n} \right \rfloor
\]

于是现在得到了一个复杂度非常玄学的做法,就是枚举\(p\)之后枚举\(p\)的倍数

暴力就写好了

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 10000005
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int mu[maxn],p[maxn],f[maxn];
int n,m,T;
int main()
{
scanf("%d",&T);
f[1]=mu[1]=1;
for(re int i=2;i<=10000000;i++)
{
if(!f[i]) p[++p[0]]=i,mu[i]=-1;
for(re int j=1;j<=p[0]&&p[j]*i<=10000000;j++)
{
f[p[j]*i]=1;
if(i%p[j]==0) break;
mu[p[j]*i]=-1*mu[i];
}
}
while(T--)
{
scanf("%d%d",&n,&m);
LL ans=0;
for(re int i=1;i<=p[0]&&p[i]<=min(n,m);i++)
{
for(re int j=1;j*p[i]<=min(n,m);j++)
ans+=mu[j]*(n/(j*p[i]))*(m/(j*p[i]));
}
printf("%lld\n",ans);
}
return 0;
}

把柿子化到这里显然还不够啊

我们需要继续搞一搞

设\(k\times p=n\)

那么

\[\sum_{p\in prime}\sum_{n|p}\mu(\frac{p}{n})\times \left \lfloor \frac{N}{n} \right \rfloor\times\left \lfloor \frac{M}{n} \right \rfloor=\sum_{p\in prime}\sum_{k=1}^{\left \lfloor\frac{N}{p}\right \rfloor}\mu(k)\times \left \lfloor \frac{N}{kp} \right \rfloor\times\left \lfloor \frac{M}{kp} \right \rfloor
\]

设\(T=kp\)

于是就有

\[\sum_{p\in prime}\sum_{k=1}^{\left \lfloor\frac{N}{p}\right \rfloor}\mu(k)\times \left \lfloor \frac{N}{kp} \right \rfloor\times\left \lfloor \frac{M}{kp} \right \rfloor=\sum_{T=1}^{N}\sum_{t|T,t\in prime}\mu(\frac{T}{t})\times \left \lfloor \frac{N}{T} \right \rfloor\times\left \lfloor \frac{M}{T} \right \rfloor
\]

\[=\sum_{T=1}^{N} \left \lfloor \frac{N}{T} \right \rfloor\times\left \lfloor \frac{M}{T} \right \rfloor\sum_{t|T,t\in prime}\mu(\frac{T}{t})
\]

发现好像前面那两个东西可以两个整除分块一起上,后面这个\(\sum_{t|T,t\in prime}\mu(\frac{T}{t})\)看起来好像需要一个前缀和

于是就可以啦

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 10000005
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int mu[maxn],f[maxn],p[maxn>>2];
LL pre[maxn];
int T,n,m;
int main()
{
f[1]=mu[1]=1;
for(re int i=2;i<=10000000;i++)
{
if(!f[i]) p[++p[0]]=i,mu[i]=-1;
for(re int j=1;j<=p[0]&&p[j]*i<=10000000;j++)
{
f[p[j]*i]=1;
if(i%p[j]==0) break;
mu[p[j]*i]=-1*mu[i];
}
}
for(re int i=1;i<=p[0];i++)
for(re int j=1;j*p[i]<=10000000;j++) pre[j*p[i]]+=mu[j];
for(re int i=1;i<=10000000;i++) pre[i]+=pre[i-1];
scanf("%d",&T);
while(T--)
{
LL ans=0;
n=read(),m=read();
if(n>m) std::swap(n,m);
for(re int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=(LL)(n/l)*(m/l)*(pre[r]-pre[l-1]);
}
printf("%lld\n",ans);
}
return 0;
}

【YY的GCD】的更多相关文章

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

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

  2. [BZOJ2820]YY的GCD

    [BZOJ2820]YY的GCD 试题描述 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少 ...

  3. bzoj 2820 YY的GCD 莫比乌斯反演

    题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...

  4. 【BZOJ】【2820】YY的GCD

    莫比乌斯反演 PoPoQQQ讲义第二题. 暴力枚举每个质数,然后去更新它的倍数即可,那个g[x]看不懂就算了…… 为什么去掉了一个memset就不T了→_→…… /****************** ...

  5. 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)

    首先我们来看一道题  BZOJ 2301 Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd( ...

  6. 【BZOJ 2820】 YY的GCD (莫比乌斯+分块)

    YY的GCD   Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少 ...

  7. 【BZOJ2820】YY的GCD(莫比乌斯反演)

    [BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...

  8. YY的GCD

    YY的GCD 给出T个询问,询问\(\sum_{i=1}^N\sum_{j=1}^M(gcd(i,j)\in prime)\),T = 10000,N, M <= 10000000. 解 显然质 ...

  9. 洛谷【P2257】YY的GCD

    YY的GCD 原题链接 这应该是我做的第一道莫比乌斯反演的题目. 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x ...

  10. 【BZOJ2820】YY的GCD

    [BZOJ2820]YY的GCD Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的( ...

随机推荐

  1. WPF的MediaElement指定Source无法播放问题解决

    最近学wpf,在使用 MediaElement 指定 Source 进行视频播放时,在源码界面可以正常显示,但运行时控件显示空白. 源码界面如下图:(可正常显示) 运行后如下图所示:(控件位置显示空白 ...

  2. c#项目代码风格要求

    代码风格没有正确与否,重要的是整齐划一,这是我拟的一份<.Net 项目代码风格要求>,供大家参考. 1. C# 代码风格要求 1.1注释 类型.属性.事件.方法.方法参数,根据需要添加注释 ...

  3. 【7】.net WebAPI Owin OAuth 2.0 密码模式验证实例

    1.OAuth密码模式 2.在VS中创建WebAPI项目 在nuget中安装: Microsoft.AspNet.WebApi.Owin Microsoft.Owin.Host.SystemWeb 这 ...

  4. flask中的数据操作

    flask中数据访问: pip install flask-sqlalemy 创建数据: 创建app的工厂 from flask import Flask from flask_sqlalchemy ...

  5. 三、hive JavaAPI示例

    在上文中https://www.cnblogs.com/lay2017/p/9973370.html 我们通过hive shell去操作hive,本文我们以Java代码的示例去对hive执行加载数据和 ...

  6. redis使用及配置之缓存详解

    redis使用及配置之缓存详解 1.Redis的介绍 Redis是一个Key-Value存储系统.它支持存储的value类型有:string(字符串),list(链表), set(无序集合),zset ...

  7. python学习之老男孩python全栈第九期_day028知识点总结——面向对象进阶、hashlib

    一. 面向对象进阶与实例 dic = {'k': 'v' } 对象:存储 属性 和 调用方法 dic['k'] = 'v' class Foo: def __init__(self, name, ag ...

  8. PHP学习笔记(二) ---- PHP数据类型

    PHP  __数据结构类型 一.php 中的八种数据类型 1.四种标量类型 Boolean (布尔类型): true  or  false,多用于条件判断. 实例: <?php $x = &qu ...

  9. ASP.NET MVC学习笔记 第一天

    MVC:Mode(模型).View(视图).Controller(控制器)         在服务器接收到请求(Request)时,路由(Routing)定义了应该调用的控制器,以及应该调用的控制器动 ...

  10. VUE知识day3_vue插件总结