【笔记篇】不普及向——莫比乌斯反演学习笔记 && 栗题HAOI2011 Problem B
Part0 广告(当然没有广告费)
P.S. 这篇文章是边学着边用Typora写的...学完了题A了blog也就呼之欲出了~有latex化式子也非常方便...非常建议喜欢Markdown的dalao们下载个~
Part1 莫比乌斯函数&&莫比乌斯反演
最近一直在做数论不是OvO
然后就一直有莫比乌斯反演这个坑没有填OvO
其实PoPoQQQ的课件已经看过不少遍了OvO
但是数论这东西不动手化式子还是不行的OvO
或许是我菜?
对于两个函数\(F(x)\)和\(f(x)\), 如果它们满足
\]
那么就有
\]
这个\(\mu(x)\)指的是莫比乌斯函数...是个积性函数, 可以线筛的那种...
线筛求莫比乌斯函数的代码:
void euler(int n){
mu[1]=1; notp[1]=1;
for(int i=2;i<=n;++i){
if(!notp[i]) prime[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*prime[j]<=n;++j){
notp[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else mu[i*prime[j]]=-mu[i];
}
}
}
PoPoQQQ的课件其实讲的已经非常好了, 然后再自己动手化化式子体会一下就比较好了~
Part2 HAOI2011 Problem B
题目大意: 明明题目已经写的很清楚了不是OvO
我们就先容斥一波, 把每个询问拆成四个...
令\(Q_{n,m}\)表示对于满足\(1\leq x\leq n,1\leq y\leq m\)且\(gcd(x,y)=k\)的数对\((x,y)\)的个数.
这样的话显然每次询问的答案就是\(Q_{b,d}-Q_{a-1,d}-Q_{b,c-1}+Q_{a-1,c-1}\)
那么如何求\(Q_{n,m}\)呢?(后来发现其实这就是bzoj1101不过是道权限题..
我们可以看出这个答案和\(1\leq x\leq \left\lfloor \frac{n}{k}\right \rfloor,1\leq y\leq \left\lfloor \frac{m}{k}\right \rfloor\),且\(gcd(x,y)=1\)的\((x,y)\)个数是一样的..
这样求的做法很显然单次询问就是\(O(nm)\)的,不是很懂拿什么过..所以需要进行优化.
这里就用到了莫比乌斯反演
不妨令\(f(d)\)为\(1\leq x \leq n,1\leq y\leq m\)且\(gcd(x,y)=d\)的\((x,y)\)个数,\(F(d)\)为\(1\leq x \leq n,1\leq y\leq m\)且\(d|gcd(x,y)\)的\((x,y)\)的\((x,y)\)个数..
这里不难看出\(F(x)\)和\(f(x)\)是满足
\]
这个条件的,而\(F(x)\)是比较好算的, 因为容易观察出\(F(x)=\left\lfloor \frac{n}{x}\right\rfloor\left\lfloor \frac{m}{x}\right\rfloor\)
所以就可以直接莫比乌斯反演...
\]
这样的话每次询问我们枚举\(d\)(\(k\)的倍数)就做完了...时间复杂度\(O(n)\)..好像还是过不了OvO
所以我们还要优化...显然现在能优化的地方就是预处理了...(多组询问的常见套路
那么预处理什么呢?
我们发现\(\left\lfloor\frac{n}{d}\right\rfloor\)这个东西最多只有\(2\sqrt n\)个取值(可证明的), 所以\(\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor\)这个东西就有不超过\(2(\sqrt n+\sqrt m)\)个取值咯~
就可以预处理了..然后维护一个前缀和做就好了...
(据说"枚举除法的取值这种方法在莫比乌斯反演的应用当中非常的常用")
枚举的方法就是
long long calc(int n,int m){
n/=k; m/=k;
int last=0; long long ans=0;
if(n>m) swap(n,m);
for(int i=1;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
ans+=1LL*(n/i)*(m/i)*(sum[last]-sum[i-1]);
}
return ans;
}
对就是这样咯~
代码(明明就是把上面两个函数拼起来←_←
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=50000;
int prime[N>>2],mu[N],sum[N],tot;
bool notp[N];
inline int gn(int a=0,char c=0){
for(;c<'0'||c>'9';c=getchar());
for(;c>47&&c<58;c=getchar())a=a*10+c-48;return a;
}
void euler(int n){
sum[1]=mu[1]=1; notp[1]=1;
for(int i=2;i<=n;++i){
if(!notp[i]) prime[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*prime[j]<=n;++j){
notp[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else mu[i*prime[j]]=-mu[i];
}
sum[i]=sum[i-1]+mu[i];
}
}
int a,b,c,d,k;
inline LL calc(int n,int m){
int last=0; LL ans=0; n/=k; m/=k;
if(n>m) swap(n,m);
for(int i=1;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
ans+=1LL*(n/i)*(m/i)*(sum[last]-sum[i-1]);
}
return ans;
}
int main(){
int T=gn(); euler(50000);
while(T--){
a=gn(),b=gn(),c=gn(),d=gn(),k=gn();
printf("%lld\n",calc(b,d)-calc(a-1,d)-calc(b,c-1)+calc(a-1,c-1));
}
}
注意事项?
就一条, 关于long long的问题..
5W相乘, 不开long long 只有30pts
但这个题卡常数.. 全开long long的话会压线5个点 TLE2个点什么的←_←
所以还是能不开long long就不要开long long了...
【笔记篇】不普及向——莫比乌斯反演学习笔记 && 栗题HAOI2011 Problem B的更多相关文章
- 莫比乌斯反演学习笔记+[POI2007]Zap(洛谷P3455,BZOJ1101)
先看一道例题:[POI2007]Zap BZOJ 洛谷 题目大意:$T$ 组数据,求 $\sum^n_{i=1}\sum^m_{j=1}[gcd(i,j)=k]$ $1\leq T\leq 50000 ...
- 莫比乌斯反演学习笔记(转载自An_Account大佬)
转载自An_Account大佬 提示:别用莫比乌斯反演公式,会炸的 只需要记住: [gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\ ...
- 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易
DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...
- 【学术篇】The Xuanku Inversion Magic学习笔记
退役之前写的 然后因为退役就咕咕咕了... 后来发现数学考试能用的到个鬼就发布出来了QwQ 主要是方便自己没登录的时候查阅... 显然子集什么的是没有学会的QwQ 所以学OI的话不要看本文!!!!!& ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- 【bzoj2440】【bzoj3994】莫比乌斯反演学习
哇..原来莫比乌斯代码这么短..顿时感觉逼格-- 写了这道题以后,才稍稍对莫比乌斯函数理解了一些 定理:和是定义在非负整数集合上的两个函数,并且满足条件,那么我们得到结论 在上面的公式中有一个函数,它 ...
- C#学习笔记8:HTML和CSS基础学习笔记
<!-- 1.<P>...</P>段落标签 2.<br/>折行标签. 3.<img src="" height="*px& ...
- 初学cdq分治学习笔记(可能有第二次的学习笔记)
前言骚话 本人蒟蒻,一开始看到模板题就非常的懵逼,链接,学到后面就越来越清楚了. 吐槽,cdq,超短裙分治....(尴尬) 正片开始 思想 和普通的分治,还是分而治之,但是有一点不一样的是一般的分治在 ...
随机推荐
- Git 学习第三天(二)
默认情况下, Git合并是采用"fast forward"模式,但这种模式下,如果删除分支,会丢掉分支信息 禁用 fast forward 模式: git merge --no-f ...
- 20140730 word标题样式 数组
1.word 标题四, 右键更新 自己也可以新建标题样式 2.数组 连续内存,空间复杂度高(即使数组存在一个元素,占据的空间的大小不变),时间复杂度低(0(1)访问),内存分配一次性完成
- NIO 源码分析(03) 从 BIO 到 NIO
目录 一.NIO 三大组件 Channels.Buffers.Selectors 1.1 Channel 和 Buffer 1.2 Selector 1.3 Linux IO 和 NIO 编程的区别 ...
- Pandas异常值处理
import pandas as pd #生成异常数据 df=pd.DataFrame({'col1':[1,120,3,5,2,12,13], 'col2':[12,17,31,53,22,32,4 ...
- hdu6537 /// DP 最长不降子序列->最长公共子序列
题目大意: 给定一个字符串 字符为0~9 求翻转某个区间后使得串中的最长不降子序列最长 因为字符范围为0~9 假设有一个 0 1 2 3 4 5 6 7 8 9 的序列 此时翻转某个区间得到形如 0 ...
- python_learn Ⅰ
基于 廖雪峰python3教程 学习. 目录: 01_输入输出.py 02_list.tuple.py 03_条件判断.py 04_循环.py 05_利用循环排序.py 06_自定义3元2次方程的根求 ...
- Spring开发案例1半注解开发
dao层: package cn.mepu.dao.imp; import cn.mepu.dao.AccountDao; import cn.mepu.domain.Account; import ...
- v-bind和v-model的区别
1:v-bind动态绑定指令,默认情况下标签自带属性的值是固定的,在为了能够动态的给这些属性添加值,可以使用v-bind:你要动态变化的值="表达式" 2:v-bind用于绑定属性 ...
- python 生成推导式
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- 【学术篇】51nod 1238 最小公倍数之和
这是一道杜教筛的入(du)门(liu)题目... 题目大意 求 \[ \sum_{i=1}^n\sum_{j=1}^nlcm(i,j) \] 一看就是辣鸡反演一类的题目, 那就化式子呗.. \[ \s ...