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. PAT_A1075#PAT Judge

    Source: PAT A1075 PAT Judge (25 分) Description: The ranklist of PAT is generated from the status lis ...

  2. img路径错误时,用户友好图片

    img 标签的属性里面添加 onerror="this.src='error友好图片'" 就可以了!

  3. 线程创建后为什么要调用CloseHandle

    很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle );  ...

  4. Redis数据结构之跳跃表-skiplist

    在Redis中,zset是一个复合结构: 使用hash来存储value和score的映射关系 使用跳跃表来提供按照score进行排序的功能,同时可以指定score范围来获取value列表 结构 zse ...

  5. git 和github简介

    关于github不清楚的可以百度, 在这里,可以创建一个新的仓库 点击Create repository后会出现下面这些信息,其中第一块是仓库的url链接 第二块是你在本地目录中创建一个READEME ...

  6. Comparable和Comparator接口是干什么的?列出它们的区别

    Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象. Java提供了 ...

  7. python_django_template模块

    官方文档 博文导航: 定义模板:   变量 标签: if for include url csrf_token 过滤器: 简单过滤器 HTML转义 加减乘除的过滤器 注释: 模板继承 模板语言:Dja ...

  8. 7.Struts2框架封装数据

    Struts2框架提供了很强大的数据封装的功能,不再需要使用Servlet的API完成手动封装了!! 第一种方式:属性驱动 > 提供对应属性的set方法进行数据的封装.--经常使用 * 表单的哪 ...

  9. 引用opencv异常

    1.异常AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d' 原因:**3.X以后OpenCv只包含部分内容,需要神经网络或者 ...

  10. cin,cout优化

    https://www.cnblogs.com/PrayG/p/5749832.html ios_base::sync_with_stdio(0);    cin.tie(0); 涨知识了