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 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...
随机推荐
- 【Webpack】373- 一看就懂之 webpack 高级配置与优化
本文原载于 SegmentFault 社区专栏 前海拾贝 作者:JS_Even_JS 一.打包多页面应用 所谓打包多页面,就是同时打包出多个 html 页面,打包多页面也是使用 html-webpac ...
- 【JS】306- 深入理解 call,apply 和 bind
作者:一像素 链接:https://www.cnblogs.com/onepixel/p/6034307.html 在JavaScript 中,call.apply 和 bind 是 Function ...
- Orleans 文档记录
Orleans 官方文档:官方文档 http://dotnet.github.io/orleans/index.html Orleans 中文文档:中文文档 https://orleanscn.git ...
- 二、Vue 页面渲染过程
前言 上篇博文我们依葫芦画瓢已经将hello world 展现在界面上啦,但是是不是感觉新虚虚的,总觉得这么多文件,项目怎么就启动起来了呢?怎么访问到8080 端口就能进入到我们的首页呢.整个的流程是 ...
- Python之如何修改运行的快捷键
如果你在Pycharm中运行程序使用Ctrl+shift+F10快捷键,运行失败,使用Pycharm工具组,右键一下选择“Run+文件名称AAA”运行程序,直接运行成功的话,那么你就可以 更换自己的运 ...
- C# DataTable 某一列取算
1. 列为数字类型double total= Convert.ToDouble(datatable.Compute("SUM(需要求和的参数)", "")); ...
- puppet5.1 安装与配置
一.Puppet概念 简介 当服务器数量达到一定的规模时,仅依靠人为完成批量部署服务器个资源的配置,运维工作将变得繁琐且容易出错,为了解决这一问题,我们应该怎么办呢?我们可以引入一批工具,这批工具可编 ...
- Sqlite—插入语句(Insert)
SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行. 基本语法:INSERT INTO TABLE_NAME VALUES (value1,value2,value3, ...
- 【机器学习实战】计算两个矩阵的成对距离(pair-wise distances)
矩阵中每一行是一个样本,计算两个矩阵样本之间的距离,即成对距离(pair-wise distances),可以采用 sklearn 或 scipy 中的函数,方便计算. sklearn: sklear ...
- 可编程实验板EPM1270T144C5使用说明