BZOJ2818 与 BZOJ2301【euler,线性筛,莫比乌斯】
题目大意:
给一个范围[1,n],从中找出两个数x,y,使得gcd(x,y)为质数,问有多少对(x,y有序)
解法:
不难,欧拉函数练手题,可以定义集合P ={x|x为素数},那么我们枚举gcd(x,y)可能等于的情况,对于任意p∈P可以得到:gcd(k1·p,k2·p) = p,当且仅当gcd(k1,k2) =1;那么我们就只需要枚举所有的k1,k2了。不妨设k1>k2,那么给定k1,k2的个数就是phi(k1),因为有序,所以给phi*2,但是,这样是否漏算了呢?没错,漏算了(1,1),补上就行了,那么这个的答案就是计算下面那个表达式。

稍有常识的人就会看出,如果我们的坦克再前进一步(大雾)要算这个式子,复杂度是O(n^2)的,我们分析一下复杂度主要消耗再哪里。
1.算phi
如果我们用暴力公式,也就是
的话,复杂度显然是很高的,全算出来高达(不是那个高达)O(n*sqrt(n)),这样的复杂度在1e7内是无法忍受的,所以我们
必须另外想办法,下面我引入三个很厉害东西:
1.当p∈P时,phi(p) = p-1;
2.如果i mod p = 0, 那么 phi(i * p)=p * phi(i),证明略,其实我也不会证
3.若i mod p ≠0, 那么 phi( i * p )=phi(i) * ( p-1 ) ;
有了这三个就容易写出线性的求euler函数了。
2.二重循环
里面那一重循环可以在外面递推乱搞,自己想,或者看我代码。
那么这个的复杂度就降为了O(n);
3.下面是代码
#include<bits/stdc++.h>
using namespace std;
int flag[],p[],tot;
int phi[];
void get_p(int end){
for(int i=;i<=end;i++)
flag[i] = ;
for(int i=; i<=end; i++){
if(flag[i]==){
p[++tot]=i;
phi[i] = i-;
}
for(int j=; j<=tot && p[j]*i<=end; j++){
flag[p[j]*i]=;
if(i%p[j]==){
phi[i*p[j]] = p[j] * phi[i]; //欧拉函数的特性
break;
}else phi[i*p[j]] = (p[j]-) * phi[i];
}
}
}
long long f[]; int main(){
int n;
cin >> n;
get_p(n);
f[] = ;
for(int i=;i<=n;i++){
f[i] = f[i-] +phi[i]*;
}
long long ans = ;
for(int i=;i<=tot;i++){
ans = ans+f[n/p[i]];
}
cout<<ans;
return ;
}
4.拓展
这个问题就这么轻易的解决了,但是我们稍加思考,就能想到它的一个变式:
变式链接: bzoj2301
给一个范围[l,n],[p,m],定义x,y,x∈[1,n],y∈[1,m],使得gcd(x,y)=k,问有多少对(x,y无序)。
对于这道题,我们不得不引入新的概念,莫比乌斯反演:
其内涵主要是下面这个公式
,其中mu是莫比乌斯函数,其定义为:
ki表示x的唯一分解后每个质数的次数。µ函数还有一个性质
上面的莫比乌斯反演公式我们还有一种表达方法,
本题要用的就是这个。
5.解决
可设f(x)表示gcd(a,b)=x的个数,F(x)表示满足x|gcd(a,b)的个数。那么我们可以考虑把区间分为两部分,对于[l,n],我们可以将它分为[1,n]-[1,l]+{l}(又不是搞数学那么讲究干嘛),然后我们先计算在[1,n]中有多少个a是x的倍数,容易得到这个数字为n/x。同理我们可以求得在[1,l]中有l/x个,在[1,m]中有m/x个,在[1,p]中有p/x个。这样我们就容易得到在[l,n]这个闭区间中有s1=(n/x-l/x+[l|x])注意,这里的[l|x]表示的是下面的意思。同样,我们也可以得到在[p,m]中有s2=(m/x-p/x+[p|x])。那么F(x) =s1*s2个(乘法原理)。
if(x % i == )
return ;
else
return ;
并且我们还能得到另一个式子
,我们的目的是要求f(k),那么由这个式子和莫比乌斯反演公式可以得到,
,嗯,我写一下看看提交上去会不会超时哈。
BZOJ2818 与 BZOJ2301【euler,线性筛,莫比乌斯】的更多相关文章
- [BZOJ4804]欧拉心算:线性筛+莫比乌斯反演
分析 关于这道题套路到不能再套路了没什么好说的,其实发这篇博客的目的只是为了贴一个线性筛的模板. 代码 #include <bits/stdc++.h> #define rin(i,a,b ...
- 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2371 Solved: 1143[Submit][Sta ...
- 【数论】【莫比乌斯反演】【线性筛】bzoj2301 [HAOI2011]Problem b
对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 100%的数据满足:1≤n≤50000,1≤a≤b ...
- 【数论】【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational
看这个题解吧:http://blog.csdn.net/wubaizhe/article/details/77338332 代码里顺便把几个常用的线性筛附上了. Key:1.gcd(i,j)==1利用 ...
- 线性筛-mobius,强大O(n)
首先,你要知道什么是莫比乌斯函数 然后,你要知道什么是积性函数 最后,你最好知道什么是线性筛 莫比乌斯反演 积性函数 线性筛,见上一篇 知道了,就可以愉快的写mobius函数了 由定义: μ(n)= ...
- Luogu2257 YY的GCD/BZOJ2818 Gcd加强版(莫比乌斯反演+线性筛)
一通套路之后得到 求出中间那个函数的前缀和的话就可以整除分块了. 暴力求的话复杂度其实很优秀了,大约在n~nlogn之间. 不过可以线性筛做到严格线性.考虑其最小质因子,如果是平方因子那么只有其有贡献 ...
- bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛
Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...
- 线性筛-euler,强大O(n)
欧拉函数是少于或等于n的数中与n互质的数的数目 φ(1)=1(定义) 类似与莫比乌斯函数,基于欧拉函数的积性 φ(xy)=φ(x)φ(y) 由唯一分解定理展开显然,得证 精髓在于对于积性的应用: ){ ...
- 【BZOJ-4407】于神之怒加强版 莫比乌斯反演 + 线性筛
4407: 于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 241 Solved: 119[Submit][Status][Discu ...
随机推荐
- JQUERY写大图轮播;附jquery的hover()方法、animate()方法、find()方法
思想:黑框设置超出部分隐藏. 红框往左移动,通过判断红框左边框距离黑框左边框的像素值,来实现红框的移动. 绿框在最上层,放每张图片的说明和序号. 一:html部分(大框.图片部分.箭头部分.图片介绍部 ...
- QQ微信刷屏助手 FlashScreenAssist 1.2发布
主要功能 文字刷屏 图片刷屏 简易教程 文字刷屏 打开软件之后输入要刷屏的文字,点击[开始],然后点一下微信或者QQ的输入框,就会开始刷屏了,注意[时间间隔]不要调太小,越小越快. 要注意的是.必须在 ...
- C#语言基础——定义变量、变量赋值、输入输出
第一部分 了解c# 一.C#的定义及其特点 C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.net的应用而开发的语言.它吸收了c++.Visual basi ...
- Android中使用开源框架citypickerview实现省市区三级联动选择
1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省 ...
- Visual Studio 2017 Bugs
Crash report information: Problem signature: Problem Event Name: CLR20r3 Problem Signature 01: deven ...
- .NET 知识整理笔记
本文纯属自己理解着写的,如果有什么错误或者不全面希望读者能够加以补充!~ 1.Web.Config配置文件的节点操作. 在Web.Config中写入. <configuration> &l ...
- 【Unity优化】构建一个拒绝GC的List
版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 上篇文章<[Unity优化]Unity中究竟能不能使用foreach?> ...
- idea 中设置成公司规范的代码格式
优雅的编码格式是一个程序员的必备素质. 最近切换到了 idea,想对自己的代码进行格式化的时候希望能自动排版成公司规定的格式,可以做以下设置: 打开 idea 的 preference: 左侧找到 c ...
- 在WPF应用程序中使用Font Awesome图标
Font Awesome 在网站开发中,经常用到.今天介绍如何在WPF应用程序中使用Font Awesome . 如果是自定义的图标字体,使用方法相同. 下载图标字体 在官方网站或github上下载资 ...
- Android7.0 Phone应用源码分析(四) phone挂断流程分析
电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...