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

$\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. ios 自定义消息提示框

    自定义提示框,3秒钟后自动消失.如上图显示效果. 提示框加载代码: - (void)viewDidLoad { [super viewDidLoad]; //将view背景颜色变更为黄色 self.v ...

  2. HDU 4276 The Ghost Blows Light (树形DP,变形)

    题意:给定一棵n个节点的树,起点是1,终点是n,每经过一条边需要消耗Ti天,每个点上有一定量的珠宝,要求必须在t天内到达终点才可以将珠宝带出去,问至多能带多少珠宝? 思路: 注意Ti可以为0,而且有可 ...

  3. 51nod 1526 分配笔名

    题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题. 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一 ...

  4. Python 字符编码问题的处理

    python中的字符编码问题往往是初学者容易弄不明白的问题, 要想将这个问题搞清楚,需要先弄明白以下的概念 decode 和 encode 函数的作用 字符串字面量的编码格式 decode(str)  ...

  5. 交互干货必收 | App界面交互设计规范

    原文地址:http://www.woshipm.com/ucd/193776.html

  6. 特别困的学生 UVa12108(模拟题)

    一.题目 课堂上有n个学生(n<=10).每个学生都有一个“睡眠-清醒”周期,其中第i个学生醒Ai分钟后睡Bi分钟,然后重复(1<=Ai,Bi<=5),初始第i个同学处于他的周期的C ...

  7. sql mybatis 使用concat乱码

    先贴代码,这是sql查询里面 select id,name,sex,phone,present,adder, CONCAT("从业",experience,"年" ...

  8. python基础一 day9 函数升阶(3)

    局部命名空间一般之间是独立,局部命名空间是调用函数时生成的函数的名字指向它所在的地址局部不会对全局产生影响,除非加global.# def max(a,b):# return a if a>b ...

  9. caffe layer层cpp、cu调试经验和相互关系

    对于layer层的cpp文件,你可以用LOG和printf.cout进行调试,cu文件不能使用LOG,可以使用cout,printf. 对于softmaxloss的layer层,既有cpp文件又有cu ...

  10. Perl 使用哈希的引用

    $ref = \%hash_clomnname_linevalue; $hash_of_whole_table{$table_name} = {%$ref};