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. LeetCode 复制带随机指针的链表

    题目链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/ 题目大意 略. 分析 空间复杂度 O(1) 的做法非常开拓思维 ...

  2. PAT_A1096#Consecutive Factors

    Source: PAT A1096 Consecutive Factors (20 分) Description: Among all the factors of a positive intege ...

  3. Git 学习第三天(二)

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

  4. Django框架(十一)—— 常用字段、参数、元信息、多对多关联关系

    目录 常用字段和参数 一.ORM字段 二.ORM参数 三.关系字段 1.ForeignKey 2.OneToOneFiled 3.ManyToManyField 四.元信息 五.多对多关联关系的三种方 ...

  5. Java多态的实现机制是什么,写得非常好!

    作者:crane_practice www.cnblogs.com/crane-practice/p/3671074.html Java多态的实现机制是父类或接口定义的引用变量可以指向子类或实现类的实 ...

  6. jquery插件小集合

    一.滑动轮播插件Swiper Swiper官网http://www.swiper.com.cn/, 这款插件移动端,pc端均试用 二.jquery-tmpl----让你从拼接字符串中解放出来 官方下载 ...

  7. SpringBoot Controller 中使用多个@RequestBody的正确姿势

    最近遇到Controller中需要多个@RequestBody的情况,但是发现并不支持这种写法, 这样导致 1.单个字符串等包装类型都要写一个对象才可以用@RequestBody接收: 2.多个对象需 ...

  8. forEach方法

    *forEach() * -这个方法只支持ie8以上的浏览器 * -forEach方法需要一个函数作为参数 * -像这种函数,由我们创建但是不由我们调用,我们称为回调函数 * 数组中由几个元素函数就会 ...

  9. IDEA2017.3.1破解激活

    idea激活有多种方式,网上较多的是使用注册码或者填License server网址,目前(2017年8月19日)使用注册码的方式,亲测可用的只有lanyun提供的注册码,但是会在2017年11月份的 ...

  10. redis设置自动启动

    按照如下操作即可(可以自定义目录) mkdir /redis cd /redis wget http://download.redis.io/releases/redis-4.0.1.tar.gz t ...