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

$\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. ThreadLocal应用场景以及源码分析

    一.应用篇 ThreadLocal介绍 ThreadLocal如果单纯从字面上理解的话好像是“本地线程”的意思,其实并不是这个意思,只是这个名字起的太容易让人误解了,它的真正的意思是线程本地变量. 实 ...

  2. codevs 2277 爱吃皮蛋的小明(水题日常)

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题目描述 Description 小明特别爱吃蛋,特别是皮蛋.他一次可以吃一个蛋或者两个蛋(整个吞下去),而且他 ...

  3. Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序

    文章的标题看似自相矛盾,然而我在"正确"二字上打了引号.我们来看一个例子,关于Java异常处理(Exception Handling)的一些知识点. 看下面这段程序.方法pleas ...

  4. ActiveMQ消息丢失怎么解决?

    在消息发送过程中消息丢失的话该怎么解决(包括网络原因): 解决思路: 可以把消息唯一ID,存到表里面,当消息接受端可以获取到这个ID,就给服务端一个回复IF,消息发送出去,没有回复,THEN一直循环发 ...

  5. mongo ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused

    解决方法 rm /var/lib/mongodb/mongod.lock

  6. 优化SQL语句的方法

    首先,对于where语句的注意事项: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where nu ...

  7. 官方webupload上传多个文件或者图片的方法

    文件上传 页面代码: <!--引入CSS--> <link rel="stylesheet" type="text/css" href=&qu ...

  8. ios之UILabel

    详细使用: UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(0, 0, 75, 40)];   //声明UIlbel并指定其位置和长 ...

  9. 十:MYSQL中的事务

    前言: 因为没有多少时间和精力,目前无法深入研究数据库中的事务,比如 但是,对于事务的一些基本知识,还是需要牢牢掌握的,做到了解事务的基本常识,在实际开发中能够理解各个持久层框架对事务的处理 一:是么 ...

  10. touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied

    docker 运行后, 执行docker logs -f myjenkins时报错: touch: cannot touch ‘/var/jenkins_home/copy_reference_fil ...