BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
问题描述
积性函数
若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\),则称 \(f(x)\) 为积性函数。
狄利克雷卷积和莫比乌斯函数
今天 zzk 神仙讲了一下狄利克雷卷积、数论分块和莫比乌斯反演。
几个数论函数
\]
\]
\]
\]
以上这几个数论函数都是积性函数。
狄利克雷卷积
有函数 \(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}\) ,则有
\]
莫比乌斯函数是一个积性函数,即对于满足 \((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=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\) ,得到
\]
考虑最大公约数为 \(1\) 的要求,可以想到 \([(i,j)==1]\) 的条件可以直接改为 \(\varepsilon((i,j))\)
又因为 \(\varepsilon((i,j))=\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 莫比乌斯反演 数论分块的更多相关文章
- 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]
Problem b Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...
- 「HAOI2011」Problem c
「HAOI2011」Problem c 传送门 由于这道题本人讲得不好,可以参考这位dalao的博客 我可就直接上代码了... 参考代码: /*---------------------------- ...
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
- [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)有多少对. ...
- [HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]
题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)
手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470 URL: (Lu ...
- 洛谷P3455 ZAP-Queries [POI2007] 莫比乌斯反演+数论分块
正解:莫比乌斯反演 解题报告: 传送门! 首先这题刚看到就很,莫比乌斯反演嘛,和我前面写了题解的那个一模一样的,所以这儿就不讲这前边的做法辣QAQ 但是这样儿还有个问题,就现在已知我每次都是要O(n) ...
- bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...
随机推荐
- postman高级应用
目录 提取接口返回值 设置动态参数 流程控制 调试 定义公共函数 外部数据文件 提取接口返回值 1.获取响应的header值 var Content-Type=postman.getResponseH ...
- 01-使用pipenv管理项目环境
一.使用pipenv管理项目环境 首先为什么我们不在真实环境下做开发呢?真实环境的一些包被其他服务所依赖,我们安装的包和模块都混杂在一起,这样不便于项目管理,还有可能出现意想不到的错误,于是就出现了包 ...
- Selnium IDE插件的安装与简单使用
一.Firefox在线安装IDE插件 1.启动Firefox,点击菜单工具->附加组件,如图: 2.在附件管理页面,手动输入Selenium IDE,搜索 3.在搜索结果中点击Selenium ...
- 深入浅出分析 PriorityQueue
一.摘要 在前几篇文章中,咱们了解到,Queue 的实现类有 ArrayDeque.LinkedList.PriorityQueue. 在上一章节中,陆续的介绍到 ArrayDeque 和 Linke ...
- 《Java算法》贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法的经典案例: 跳跃游戏: 给定一个非负整 ...
- var和let部分浅析
ES6中新增了let命令,用于声明变量,但所声明的变量只在let命令的代码块内有效. 举个例子: var a = []; for(var i=0;i<10;i++){ a[i] = functi ...
- CMAKE同时编译C++和CUDA文件
1. 首先是运行环境 Ubuntu 16.04 G++ 5.4.0 CUDA 8.0 2. 文件结构 cv@cv:~/myproject$ tree src src/ |-- CMakeLists.t ...
- B站上传字幕问题解决
博客:blog.shinelee.me | 博客园 | CSDN B站上传字幕时,如果srt文件中出现如下空行,则会报错,仅上传了空行前的部分 于是写了个python脚本,如下: import pys ...
- 记录AJAX充电点点滴滴
首先要明白什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更 ...
- 如何快速将多个excel表格的所有sheet合并到一个sheet中
1.将需要合并的excel文件放在同一个文件夹下: 2.新建一个excel表格并打开,右键sheet1,查看代码,然后复制下方的代码到代码框里,点击菜单栏中的“运行”–“运行子过程/用户窗体”,等待程 ...