我们可以枚举每一个质数,那么答案就是

$\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)}\lfloor n / T \rfloor *\lfloor m / T \rfloor \sum_{d \mid T}\mu(d)$

显然第一个更好求,我们只需要枚举质数即可

根据欧拉公式近似$\sum_{i=1} \frac{1}{i} = ln n + r$

每个质数均摊logn的复杂度,那么质数个数是n/logn的,我们就可以O(n)预处理了。

如果枚举第二个的话,复杂度是nlogn的

然后算出前缀和,进行下界函数分块即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 10000005
int mu[maxn],pr[maxn],top,sim[maxn];
bool vis[maxn];
void init()
{
memset(vis,false,sizeof vis);
mu[1]=1;
F(i,2,maxn-1)
{
if (!vis[i]) pr[++top]=i,mu[i]=-1;
F(j,1,top)
{
if (pr[j]*i>=maxn) break;
vis[i*pr[j]]=true;
if (i%pr[j]==0) {mu[i*pr[j]]=0;break;}
mu[i*pr[j]]=-mu[i];
}
}
// F(i,1,10) printf("%d ",mu[i]);
} int t,n,m; ll solve(int n,int m)
{
ll ret=0;
if (n>m) swap(n,m);
for (int i=1,last=0;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ret+=((ll)sim[last]-sim[i-1])*(m/i)*(n/i);
}
return ret;
} int main()
{
init();
F(i,1,top)
F(j,1,inf)
{
if (pr[i]*j>=maxn) break;
sim[pr[i]*j]+=mu[j];
}
F(i,1,maxn-1) sim[i]+=sim[i-1];
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
printf("%lld\n",solve(n,m));
}
}

然后我们发现这个函数是可以线性筛的,尽管它不是积性函数

$g(pr[j]*i)=\mu (i) ,pr[j] \mid i$

$g(pr[j]*i)=\mu(i)-g[i] , pr[j] \nmid i$

然后就可以$\Theta (n)$去预处理了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 10000005
int mu[maxn],pr[maxn],top,sim[maxn];
bool vis[maxn];
void init(int tmp)
{
memset(vis,false,sizeof vis);
mu[1]=1;sim[1]=0;
F(i,2,tmp)
{
if (!vis[i])
{
pr[++top]=i;
mu[i]=-1;
sim[i]=1;
}
F(j,1,top)
{
if (pr[j]*i>tmp) break;
vis[i*pr[j]]=true;
if (i%pr[j]==0)
{
mu[i*pr[j]]=0;
sim[i*pr[j]]=mu[i];
break;
}
mu[i*pr[j]]=-mu[i];
sim[i*pr[j]]=mu[i]-sim[i];
}
}
F(i,1,tmp) sim[i]+=sim[i-1];
} int t; ll solve(int n,int m)
{
ll ret=0;
for (int i=1,last=0;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ret+=((ll)sim[last]-sim[i-1])*(m/i)*(n/i);
}
return ret;
} int n[10005],m[10005]; int main()
{
F(i,1,maxn-1) sim[i]+=sim[i-1];
scanf("%d",&t);int tmp=0;
F(i,1,t)
{
scanf("%d%d",&n[i],&m[i]);
if (n[i]>m[i]) swap(n[i],m[i]);
tmp=max(tmp,n[i]);
}
init(tmp);
F(i,1,t)printf("%lld\n",solve(n[i],m[i]));
}

  

BZOJ 2820 YY的GCD ——莫比乌斯反演的更多相关文章

  1. [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)有多少对. ...

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

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

  3. Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

    2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

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

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

  5. bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛

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

  6. BZOJ 2820: YY的GCD 莫比乌斯反演_数学推导_线性筛

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <vecto ...

  7. 【莫比乌斯反演】关于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( ...

  8. 【刷题】BZOJ 2820 YY的GCD

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

  9. SPOJ PGCD 4491. Primes in GCD Table && BZOJ 2820 YY的GCD (莫比乌斯反演)

    4491. Primes in GCD Table Problem code: PGCD Johnny has created a table which encodes the results of ...

随机推荐

  1. c语言中的->代表什么意思

    c语言中 ->符号是什么意思? 比如c=a->b a为结构体或联合体的指针,->表示调用其成员

  2. Yii2.0 Cookies机制和使用方法

    在实际的项目开发过程中,用到了Yii2.0 Cookies机制!但是遇到一个十分奇葩的问题,同一个YII框架,backend下Cookies能够正常存储于客户端,但是frontend始终不行.文章的最 ...

  3. Azure 项目构建 – 部署 Jenkins 服务器以实现持续集成(CI)

    通过完整流程详细介绍了如何通过 Azure 虚拟机.虚拟网络等服务在 Azure 平台上快速搭建 Jenkins 服务器. 此系列的全部课程 https://school.azure.cn/curri ...

  4. HDU 1171 Big Event in HDU 杭电大事件(母函数,有限物品)

    题意: 分家问题,对每种家具都估个值,给出同样价值的家具有多少个,要求尽可能平分,打印的第一个数要大于等于第二个数. 思路: 可以用背包做,也可以用母函数.母函数的实现只需要注意一个点,就是每次以一种 ...

  5. 你是猴子请来的逗比么!IT跳槽大事件

       3月招聘大战早已硝烟四起,互联网职场摇身一变成了跳蚤市场,猎头们告诉跳蚤们,跳不跳不是不问题,往哪儿跳才是重点,跳对了高薪期权都如过眼云烟.不过小编不得不说,劳资最痛恨那些跳槽的人啦!就因为加班 ...

  6. Objective-C分类 (category)和扩展(Extension) 的区别

    http://blog.csdn.net/yhawaii/article/details/6992094 http://blog.163.com/wangy_0223/blog/static/4501 ...

  7. 真爱 vs. 种姓:新一代印度人的婚恋观

    今日导读 “自由恋爱”是所有世界上所有有情人共同的心愿,而在印度,因为其根深蒂固的种姓制度,仍然有大批情侣只能听从父母的“包办婚姻”,被迫与心爱的人分离.但是最新的一项调查表明,印度的年轻一代开始出现 ...

  8. javaEE(10)_jdbc基本使用

    一.JDBC简介 1.SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC,JDBC(Java Data Base Connectivity,java数据库连接) ...

  9. SVN的配置

    Xcode 是开发人员建立 Mac OS X 应用程序的最快捷方式,也是利用新的苹果电脑公司技术的最简单的途径,而SVN是版本控制工具,那么Xcode SVN又是什么呢?如何配置Xcode SVN? ...

  10. C语言格式化说明符

    1.1.1 格式化输入输出函数一.printf()函数printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息.在编写程序时经常会用到此函数.printf()函数的调用格式为: ...