Part0 广告(当然没有广告费)

P.S. 这篇文章是边学着边用Typora写的...学完了题A了blog也就呼之欲出了~有latex化式子也非常方便...非常建议喜欢Markdown的dalao们下载个~

Part1 莫比乌斯函数&&莫比乌斯反演

最近一直在做数论不是OvO

然后就一直有莫比乌斯反演这个坑没有填OvO

其实PoPoQQQ的课件已经看过不少遍了OvO

但是数论这东西不动手化式子还是不行的OvO

或许是我菜?

没错,莫比乌斯就是发现那个奇怪的扭曲的环的男人...

对于两个函数\(F(x)\)和\(f(x)\), 如果它们满足

\[F(n)=\sum_{d|n}f(d)
\]

那么就有

\[f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})=\sum_{n|d}\mu(\frac{d}{n})F(d)
\]

这个\(\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(n)=\sum_{d|n}f(d)
\]

这个条件的,而\(F(x)​\)是比较好算的, 因为容易观察出\(F(x)=\left\lfloor \frac{n}{x}\right\rfloor\left\lfloor \frac{m}{x}\right\rfloor​\)

所以就可以直接莫比乌斯反演...

\[f(x)=\sum_{x|d}\mu(\frac{d}{x})F(d)=\sum_{x|d}\mu(\frac{d}{x})\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\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的更多相关文章

  1. 莫比乌斯反演学习笔记+[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 ...

  2. 莫比乌斯反演学习笔记(转载自An_Account大佬)

    转载自An_Account大佬 提示:别用莫比乌斯反演公式,会炸的 只需要记住: [gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\ ...

  3. 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易

    DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...

  4. 【学术篇】The Xuanku Inversion Magic学习笔记

    退役之前写的 然后因为退役就咕咕咕了... 后来发现数学考试能用的到个鬼就发布出来了QwQ 主要是方便自己没登录的时候查阅... 显然子集什么的是没有学会的QwQ 所以学OI的话不要看本文!!!!!& ...

  5. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  6. 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 ...

  7. 【bzoj2440】【bzoj3994】莫比乌斯反演学习

    哇..原来莫比乌斯代码这么短..顿时感觉逼格-- 写了这道题以后,才稍稍对莫比乌斯函数理解了一些 定理:和是定义在非负整数集合上的两个函数,并且满足条件,那么我们得到结论 在上面的公式中有一个函数,它 ...

  8. C#学习笔记8:HTML和CSS基础学习笔记

    <!-- 1.<P>...</P>段落标签 2.<br/>折行标签. 3.<img src="" height="*px& ...

  9. 初学cdq分治学习笔记(可能有第二次的学习笔记)

    前言骚话 本人蒟蒻,一开始看到模板题就非常的懵逼,链接,学到后面就越来越清楚了. 吐槽,cdq,超短裙分治....(尴尬) 正片开始 思想 和普通的分治,还是分而治之,但是有一点不一样的是一般的分治在 ...

随机推荐

  1. Git 学习第三天(二)

    默认情况下, Git合并是采用"fast forward"模式,但这种模式下,如果删除分支,会丢掉分支信息 禁用 fast forward 模式: git merge --no-f ...

  2. 20140730 word标题样式 数组

    1.word 标题四, 右键更新 自己也可以新建标题样式 2.数组 连续内存,空间复杂度高(即使数组存在一个元素,占据的空间的大小不变),时间复杂度低(0(1)访问),内存分配一次性完成

  3. NIO 源码分析(03) 从 BIO 到 NIO

    目录 一.NIO 三大组件 Channels.Buffers.Selectors 1.1 Channel 和 Buffer 1.2 Selector 1.3 Linux IO 和 NIO 编程的区别 ...

  4. Pandas异常值处理

    import pandas as pd #生成异常数据 df=pd.DataFrame({'col1':[1,120,3,5,2,12,13], 'col2':[12,17,31,53,22,32,4 ...

  5. hdu6537 /// DP 最长不降子序列->最长公共子序列

    题目大意: 给定一个字符串 字符为0~9 求翻转某个区间后使得串中的最长不降子序列最长 因为字符范围为0~9 假设有一个 0 1 2 3 4 5 6 7 8 9 的序列 此时翻转某个区间得到形如 0 ...

  6. python_learn Ⅰ

    基于 廖雪峰python3教程 学习. 目录: 01_输入输出.py 02_list.tuple.py 03_条件判断.py 04_循环.py 05_利用循环排序.py 06_自定义3元2次方程的根求 ...

  7. Spring开发案例1半注解开发

    dao层: package cn.mepu.dao.imp; import cn.mepu.dao.AccountDao; import cn.mepu.domain.Account; import ...

  8. v-bind和v-model的区别

    1:v-bind动态绑定指令,默认情况下标签自带属性的值是固定的,在为了能够动态的给这些属性添加值,可以使用v-bind:你要动态变化的值="表达式" 2:v-bind用于绑定属性 ...

  9. python 生成推导式

    推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...

  10. 【学术篇】51nod 1238 最小公倍数之和

    这是一道杜教筛的入(du)门(liu)题目... 题目大意 求 \[ \sum_{i=1}^n\sum_{j=1}^nlcm(i,j) \] 一看就是辣鸡反演一类的题目, 那就化式子呗.. \[ \s ...