问题描述

BZOJ2301

LG2522


积性函数

若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\),则称 \(f(x)\) 为积性函数。

狄利克雷卷积和莫比乌斯函数

今天 zzk 神仙讲了一下狄利克雷卷积、数论分块和莫比乌斯反演。

几个数论函数

\[1(x)=1
\]

\[id(x)=x
\]

\[id^k(x)=x^k
\]

\[\varepsilon(x)=\begin{cases}1&x=1\\0&x\neq1\end{cases}
\]

以上这几个数论函数都是积性函数。

狄利克雷卷积

有函数 \(f(x),g(x)\) , 若有函数 \(h(x)=\sum\limits_{d|x}{f(d)g(\frac{x}{d})}\) ,则称 \(h(x)\) 是 \(f(x),g(x)\) 的卷积。

记作 \(h(x)=f(x)*g(x)\)

狄利克雷卷积有如下性质:

  • 交换律,即 \(f*g=g*f\)

  • 结合律,即 \((a*b)*c=a*(b*c)\)

  • 若 \(f,g\) 都是积性函数,则 \(f*g\) 也是积性函数,即 \(f*g(mn)=f*g(m) \times f*g(n)((n,m)=1)\)

单位元 \(\varepsilon\)

若 \(f*g = \varepsilon\) ,则 \(f\) 与 \(g\) 互为逆

莫比乌斯函数

\(\mu(x)\)代表莫比乌斯函数。

对 \(x\) 应有质数唯一分解定理,将 \(x\) 表示为 \(x=\prod_{i=1}^{k} p_i^{c_i}\) ,则有

\[\mu(x)=\begin{cases}0&\exists c_i \ge 2\\(-1)^{k}&\forall c_i=1\end{cases}
\]

莫比乌斯函数是一个积性函数,即对于满足 \((x,y)=1\) 的 \(x,y\) ,有 \(\mu(xy)=\mu(x) \times \mu(y)\)

有重要性质 \(\sum\limits_{d|x}{\mu(d)}=\varepsilon=\begin{cases}0&x \neq 1\\1&x=1\end{cases}\)

莫比乌斯反演

套式子:

\[f(x)=\sum\limits_{d|x}g(d) \Rightarrow g(x)=\sum\limits_{d|x}f(d)\mu(\frac{x}{d})
\]

用狄利克雷卷积来解释,就是 \(f=g*1,g=f*\mu\)


数论分块

简单问题

数论分块一般的问题是求 \(\sum_{d=1}^n{\lfloor \frac{n}{d} \rfloor}\)

考虑分块思想,把 \(\lfloor \frac{n}{d} \rfloor\) 数值相同的划分为一块求。

于是可以得到以下代码:


稍复杂问题 \(1\)


题解

题意是要求 \(\sum\limits_{i=a}^{b}{\sum\limits_{j=c}^{d}{[(i,j)==k]}}\)

显然可以通过差分,将问题转化为求 \(\sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{m}{[(i,j)==k]}}\)

可以通过在两边同时除去 \(k\) ,得到

\[\sum\limits_{i=1}^{\frac{n}{k}}{\sum\limits_{j=1}^{\frac{m}{k}}{[(i,j)==1]}}
\]

考虑最大公约数为 \(1\) 的要求,可以想到 \([(i,j)==1]\) 的条件可以直接改为 \(\varepsilon((i,j))\)

又因为 \(\varepsilon((i,j))=\sum\limits_{d|(i,j)}{\mu(d)}\) ,所以式子转化为

\[\sum\limits_{i=1}^{\frac{n}{k}}{\sum\limits_{j=1}^{\frac{m}{k}}{\sum\limits_{d|(i,j)}{\mu(d)}}}
\]

对 \(\sum\) 进行变换,得到


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; const int maxn=50000; int T; void Init(void){
scanf("%d",&T);
} int p[maxn+7],pr[maxn+7],miu[maxn+7],s[maxn+7];
int tot; void preprocess(){
miu[1]=1;
for(int i=2;i<=maxn;i++){
if(!p[i]) p[i]=i,pr[++tot]=i,miu[i]=-1;
for(int j=1;j<=tot;j++){
if(i*pr[j]>maxn||p[i]<pr[j]) break;
p[i*pr[j]]=pr[j];
if(i%pr[j]) miu[i*pr[j]]=-miu[i];
else miu[i*pr[j]]=0;
}
}
for(int i=1;i<=maxn;i++) s[i]=s[i-1]+miu[i];
} int calc(int x,int y){
if(x>y) swap(x,y);
if(x==0||y==0) return 0;
int res(0);
for(int l=1,r;l<=x;l=r+1){
r=min(x/(x/l),y/(y/l));
res+=(s[r]-s[l-1])*(x/l)*(y/l);
}
return res;
} void Work(void){
preprocess();
while(T--){
int a,b,c,d,k;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
--a,--c;
printf("%d\n",calc(b/k,d/k)+calc(a/k,c/k)-calc(a/k,d/k)-calc(b/k,c/k));
}
} int main(){
Init();
Work();
return 0;
}

BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块的更多相关文章

  1. 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]

    Problem b Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...

  2. 「HAOI2011」Problem c

    「HAOI2011」Problem c 传送门 由于这道题本人讲得不好,可以参考这位dalao的博客 我可就直接上代码了... 参考代码: /*---------------------------- ...

  3. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

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

  5. [HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]

    题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? ...

  6. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  7. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)

    手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470 URL: (Lu ...

  8. 洛谷P3455 ZAP-Queries [POI2007] 莫比乌斯反演+数论分块

    正解:莫比乌斯反演 解题报告: 传送门! 首先这题刚看到就很,莫比乌斯反演嘛,和我前面写了题解的那个一模一样的,所以这儿就不讲这前边的做法辣QAQ 但是这样儿还有个问题,就现在已知我每次都是要O(n) ...

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

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

随机推荐

  1. .NetCore部署到CentOS

    “天下熙熙,皆为利来:天下攘攘,皆为利往.”,越来越多的人涌入IT这个行业,使得技术发展日新月异之外,也会无情淘汰跟不上潮流的人,所以作为IT从业人员,一定要时刻关注前沿技术,免得有朝一日被拍在沙滩上 ...

  2. hibernate mysql中文检出无效

    在学习ssh框架是发现,检索条件是英文时,sql就能按照条件过滤出数据,当我换成中文是,检索出来的数据就是空,最后发现没有设置数据库连接url的编码格式 1.数据库编码 COLLATE='utf8_g ...

  3. 8月份21道最新Java面试题剖析(数据库+JVM+微服务+高并发)

    前言 纵观几年来的Java面试题,你会发现每家都差不多.你仔细观察就会发现,HashMap的出现几率未免也太高了吧!连考察的知识点都一样,什么hash碰撞啊,并发问题啊!再比如JVM,无外乎考内存结构 ...

  4. leetcode-算法系列-两数之和

    本系列的题目都是出自于"leetcode" 用博客记录是为了加强自己的记忆与理解,也希望能和大家交流更好更优的解题思路. 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值 ...

  5. Spring Cloud第九篇 | 分布式服务跟踪Sleuth

    ​ ​本文是Spring Cloud专栏的第九篇文章,了解前八篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  6. LVS+Keepalived-DR模式

    Environment:4台CentOS机器 两台LVS 两台web服务器 LVS主备的操作,都需要安装ipvsadm和keepalived yum -y install ipvsadm keepal ...

  7. 基于Vue的前后端分离项目实践

    一.为什么需要前后端分离 1.1什么是前后端分离  前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...

  8. springboot搭建项目,实现Java生成随机图片验证码。

    这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...

  9. 如何快速将多个excel表格的所有sheet合并到一个sheet中

    1.将需要合并的excel文件放在同一个文件夹下: 2.新建一个excel表格并打开,右键sheet1,查看代码,然后复制下方的代码到代码框里,点击菜单栏中的“运行”–“运行子过程/用户窗体”,等待程 ...

  10. Android 上下文菜单 ContextMenu

    public class MainActivity extends Activity { private ListView listView; @Override protected void onC ...