【BZOJ3309】DZY Loves Math(莫比乌斯反演)

题面

\[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))
\]

其中,\(f(x)\)表示\(x\)分解质因数之后,最高的幂次

题解

完全不会莫比乌斯反演了。

先来推式子

\[\sum_{d=1}^a\sum_{i=1}^{a/d}\sum_{j=1}^{b/d}[gcd(i,j)=1]f(d)
\]

\[\sum_{d=1}^af(d)\sum_{i=1}^{a/d}\sum_{j=1}^{b/d}[gcd(i,j)=1]
\]

设\(F(x)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=x]\)

\(G(x)=\sum_{x|d}f(d)=\sum_{i=1}^n\sum_{j=1}^m[x|gcd(i,j)]\)

所以\(G(x)=[\frac{n}{x}][\frac{m}{x}]\)

所以原式可以变为

又有\(F(x)=\sum_{x|d}\mu(\frac{d}{x})G(d)\)

所以\(F(1)=\sum_{d=1}^n\mu(d)G(d)\)

所以所求变为

\[\sum_{d=1}^af(d)\sum_{i=1}^{a/d}\mu(i)G(i)
\]

\[\sum_{d=1}^af(d)\sum_{i=1}^{a/d}\mu(i)[\frac{a}{id}][\frac{b}{id}]
\]

老套路了,令\(T=id\)

\[\sum_{T=1}^a[\frac{a}{T}][\frac{b}{T}]\sum_{d|T}f(d)\mu(\frac{T}{d})
\]

后面这个玩意怎么算呢??

迷茫啊。。。。

考虑枚举的每一个\(T=p1^{a1}*p2^{a2}...pn^{an}\)

因为\(\mu\)要非零才有贡献,所以\(\frac{T}{d}\)的每一个质因数最多取\(1\),因此一共有\(2^n\)个对应的\(d\)

假设确定了选择某个质因数\(px^{ax-1}\),并且它是最高幂了

那么所有比它低的幂次都可以随意选或者不选,

一共是\(2^{?-1}\)个,不难证明此时\(f(d)\)的值一样,\(\mu\)的值恰好一一对应为\(-1,1\),此时的和一定为\(0\)

这样的前提是存在比他低的次幂,也就意味着所有的幂次不全相等。

假设全部相等的时候?

也就是\(T=(p1p2p3..pn)^a\)

\(d=(p1p2..pn)^{a-1}\)时,\(f(d)=a-1\)

其他情况下\(f(d)=a\)

先假设所有情况下\(f(d)=a\)

显然最终的和也是\(0\)

但是有一种情况下为\(a-1\),因此要对于上面那种情况额外把\(1\)减掉

因此贡献是\(-1*\mu(p1p2p3..pn)=(-1)^{(n+1)}\)

这样就可以算出后面那一坨东西的值了。

至于怎么线性筛?

额外记录每个数出去最小质因子后的数\(lst[i]\)

以及最小质因子的幂次

这样就可以通过\(lst[i]\)计算出结果了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 10000000
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
bool zs[MAX+1];
int pri[MAX+1],tot,g[MAX+1],lst[MAX+1],fp[MAX+1];
void pre()
{
for(int i=2;i<=MAX;++i)
{
if(!zs[i])pri[++tot]=i,lst[i]=g[i]=fp[i]=1;
for(int j=1;j<=tot&&i*pri[j]<=MAX;++j)
{
int x=i*pri[j];
zs[x]=true;
if(i%pri[j]==0)
{
lst[x]=lst[i];
fp[x]=fp[i]+1;
if(lst[x]==1)g[x]=1;
else g[x]=(fp[lst[x]]==fp[x]?-g[lst[x]]:0);
break;
}
lst[x]=i;fp[x]=1;g[x]=(fp[i]==1?-g[i]:0);
}
}
for(int i=1;i<=MAX;++i)g[i]+=g[i-1];
}
int main()
{
pre();
int T=read();
while(T--)
{
int a=read(),b=read();
if(a>b)swap(a,b);
ll ans=0;
for(int i=1,j;i<=a;i=j+1)
{
j=min(a/(a/i),b/(b/i));
ans+=1ll*(a/i)*(b/i)*(g[j]-g[i-1]);
}
printf("%lld\n",ans);
}
return 0;
}

【BZOJ3309】DZY Loves Math(莫比乌斯反演)的更多相关文章

  1. [BZOJ3309]DZY Loves Math(莫比乌斯反演+线性筛)

    $\sum\limits_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum\limits_{d|T}f(d)\mu(\fr ...

  2. 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)

    [BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...

  3. 【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

    3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007) ...

  4. bzoj 3309 DZY Loves Math 莫比乌斯反演

    DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1303  Solved: 819[Submit][Status][Dis ...

  5. 【BZOJ3309】DZY Loves Math - 莫比乌斯反演

    题意: 对于正整数n,定义$f(n)$为$n$所含质因子的最大幂指数.例如$f(1960)=f(2^3 * 5^1 * 7^2)=3$,$f(10007)=1$,$f(1)=0$. 给定正整数$a,b ...

  6. 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

    Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b, ...

  7. BZOJ 3309 DZY Loves Math ——莫比乌斯反演

    枚举$d=gcd(i,j)$ 然后大力反演 ——来自Popoqqq的博客. 然后大力讨论后面的函数的意义即可. http://blog.csdn.net/popoqqq/article/details ...

  8. BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]

    题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...

  9. BZOJ3309 DZY Loves Maths 莫比乌斯反演、线性筛

    传送门 推式子(默认\(N \leq M\)): \(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^Mf(gcd(i,j)) & = ...

  10. bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...

随机推荐

  1. Luogu P1439 【模板】最长公共子序列

    又是模板题呵,但这次的难度有点增加. 先看题目第一个想到DP的经典算法,要O(n^2),然后想其它的算法. 其实我们衢州市一次联考有一题很像这题,不过还要难一点. 思想是离散化+最长不下降子序列(在这 ...

  2. HNOI2019 鱼 fish

    本来想写个改题记录的然后想了想改不完所以就分开写了= = https://www.luogu.org/problemnew/show/P5286 显然枚举A,D,然后鱼头和鱼身分开来考虑. 鱼身:先枚 ...

  3. REST-framework快速构建API--生成Swagger接口文档

    一.Swagger概述 1.引言 当接口开发完成,紧接着需要编写接口文档.传统的接口文档使用Word编写,or一些接口文档管理平台进行编写,但此类接口文档维护更新比较麻烦,每次接口有变更,需要手动修改 ...

  4. c++对象模型-对象模型

    1:简单对象模型 1>介绍:每个成员都使用一个指针指向真正的成员.所以对象 的大小很好确定,就是成员数*指针大小. 2>用途:成员函数就是使用这个模型的 3>图: 4>加上继承 ...

  5. Git的学习与使用

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN和Git最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自 ...

  6. 一个数据表通过另一个表更新数据(在UPDAT语句中使用FROM子句)

    在sql server中,update可以根据一个表的信息去更新另一个表的信息. 首先看一下语法: update A SET 字段1=B表字段表达式, 字段2=B表字段表达式   from B WHE ...

  7. OneZero第一次随感

    >本人基础薄弱,有幸加入这个团队,甚感欣慰.这是本人第一次尝试写博客,说实话,胆怯.因为能力有限,怕技能匮乏,说不好.但是我知道既然加入这个团队,就要为团队负责.万事开头难,过程也挺难(就我个人 ...

  8. Visual Studio平台安装及测试

    一.VS安装 图1.1 图1.2 二.单元测试练习 题目:课本22~25页单元测试练习 1.创建一个c#类(具体如下:打开VS2010,然后点击VS界面上左上角的文件按钮,然后点击文件—新建—项目,就 ...

  9. 《面向对象程序设计》c++第五次作业___calculator plus plus

    c++第五次作业 Calculator plusplus 代码传送门 PS:这次作业仍然orz感谢一位同学与一位学长的windows帮助,同时再次吐槽作业对Mac系统用户的不友好.(没朋友千万别用Ma ...

  10. c++中常见概念、关键字等的区别

    (1).重载,覆盖和隐藏的区别: 重载主要是函数的重载,函数名相同,返回类型相同,但是函数形参不同,被调用时,根据函数形参决定调用原函数还是重载函数. 覆盖主要用在继承多态中,函数前加virtual关 ...