(转载)关于gcd的8题
发现其实有关gcd的题目还是挺多的,这里根据做题顺序写出8题。
[bzoj2818: Gcd] gcd(x,y)=质数, 1<=x,y<=n的对数
做这题的时候,懂得了一个非常重要的转化:求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, 1 <= x, y <= n/k的对数!所以,枚举每个质数p(线性筛素数的方法见:线性时间内筛素数和欧拉函数),然后求(x, y) = 1, 1 <= x, y <= n/p的个数。
那(x, y) = 1的个数如何求呢?其实就是求互质的数的个数。在[1, y]和y互质的数有phi(y)个,如果我们令x < y,那么答案就是sigma(phi(y))。因为x, y是等价的,所以答案*2,又因为(1, 1)只有一对,所以-1。最终答案为sigma(sigma(phi(n/prime[i])) * 2 - 1)。
1 |
|
[bzoj2190: [SDOI2008]仪仗队] 求gcd(x,y)=1, 0<=x,y<=n的对数
嗯……似乎这题在上一题的时候解决了。不过要注意的是,这题范围是从0开始的,所以,会多出(1, 0)和(0, 1)这两组,答案就是sigma(phi(i)) - 1 + 2。
[bzoj2005: [Noi2010]能量采集] 求sigma(gcd(x,y)), 1<=x<=n, 1<=y<=m
令f[d]为(x, y) = d的对数,那么答案就是sigma(f[i]*((i-1)*2+1))
f[i]怎么求呢?在1 <= x <= n, 1 <= y <= m中,gcd(x, y) | d的有[n/d] * [m/d]个。不过我们要扣掉所有的倍数,f[i] = [n/d] * [m/d] - f[2i] - f[3i] - f[4i] - ...。逆序做即可。
后来我在想:
- 为什么上面几题不用这题的方法呢?嗯,因为
x, y的取值不一样,这样的话就不得不把莫比乌斯反演搬出来了。 - 为什么这题不用上面几题的方法呢?嗯,因为这个的复杂度是
O(nlogn)(O(n/1 + n/2 + ... + n/n) = O(nlogn)),而上面的复杂度只有O(n + n/logn)(质数个数是n/logn级别的)。
1 |
|
[SPOJ VLATTICE] gcd(i,j,k)=1, 0<=i,j,k<=n 的个数
莫比乌斯反演(Möbius inversion formula)终于出现了!莫比乌斯反演的基本形式就是:
g(n) = sigma(d|n, f(d))
f(n) = sigma(d|n, μ(n/d) * g(d))
还有另外一个形式是:
g(n) = sigma(d|n, f(d))
f(n) = sigma(n|d, μ(n) * g(n/d))
通俗的来说,g(n)和f(n)的关系,就是包含和仅包含的关系。
令g(x)为满足x | (i, j, k)的个数,f(x)为满足(i, j, k) = x的个数。显然g(n) = sigma(d|n, f(d)) = [n/x] * [n/x] * [n/x],所以答案f(1)就可以用下面那个公式算出来了,也就是sigma(μ(d) * [n/d] * [n/d] * [n/d])。
不过需要注意的是,这题的范围可以取0,所以我们还需要加上某一维为0的,某两维为0的方案(基本一样啦)。
1 |
|
[bzoj1101: [POI2007]Zap] 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<=b
首先肯定想到转化成求gcd(x, y) = 1, 1 <= x <= a/d, 1 <= y <= b/d的对数,和上面一题一样。虽然上面那题复杂度很优,只有O(n),但是对于这边的多组数据完全就无法承受了。
其实,只有O(sqrt(n))个不同的n/i的取值,因此我们可以求mu[i]的前缀和然后分块做!分块可以参考[CQOI2007]余数之和sum bzoj1257。
1 |
|
[bzoj2301: [HAOI2011]Problem b] 求有多少对数满足 gcd(x,y)=k, a<=x<=b, c<=y<=d
和上面那题几乎一样,只是多了x, y的下界。其实这个可以在算方案的时候yy一下,但是总觉得可能会哪里边界算错,于是就是用了一种偷懒的方法:容斥原理。事实上,这种方法并不会比只算一次的方法来的慢多少。
记f[a, b]为满足(x, y) = 1, 1 <= x <= a, 1 <= y <= b的对数,那么答案就是f[B/K, D/K] - f[(A-1)/K, D/K] - f[B/K, (C-1)/K] + f[(A-1)/K, (C-1)/K]
1 |
|
[bzoj2820: YY的GCD] 求1<=x<=N, 1<=y<=M且gcd(x,y)为质数有多少对
如果枚举质数的话就要给这个多组数据跪成傻逼了。
ans = sigma(p, sigma(d, μ(d) * (n/pd) * (m/pd)))
Let s = pd, then
ans = sigma(s, sigma(p, μ(s/p) * (n/s) * (m/s)))
= sigma(s, (n/s) * (m/s) * sigma(p, μ(s/p)))
Let g(x) = sigma(p, μ(x/p)), then
ans = sigma(s, (n/s) * (m/s) * g(s))
如果我们能预处理g(x)的话就能和前面一样分块搞了。这个时候我们多么希望g(x)和μ(x)一样是积性函数。看完题解后,发现有一个不是积性函数,胜似积性函数的性质。由于题解没有给证明,所以就意淫了一个证明。
考虑质数p',g(p'x) = sigma(p | p'x, μ(p'x/p))。
- 当
x % p' == 0,那么考虑sigma中的变量p的所有取值,它和g(x)中p是相同的。而μ(x)这个函数,如果x有平方因子的话就等于0,因此当p != p'时μ(p'x/p) = 0,当p == p'是,μ(p'x/p) = μ(x)。所以g(p'x) = μ(x)。 - 当
x % p' != 0,同样考虑p,会发现它的取值只比g(x)中的p多出一个p'。同理按照p是否等于p'讨论,可以得到g(p'x) = -g(x) + μ(x)。
因此g(x)可以在线性筛素数的时候算出。剩下的就是前缀和、分块了。
1 |
|
[bzoj2705: [SDOI2012]Longge的问题] 求 sigma(gcd(i,n), 1<=i<=n<2^32)
又是令gcd(i, n) = d,答案就是sigma(phi(n/d)),但是我们不能预处理出phi[]数组,因为开不了数组……
注意到因数个数是O(2sqrt(n))级别的,我们枚举所有的n/d,一边dfs一边算phi。
1 |
|
(转载)关于gcd的8题的更多相关文章
- [转载]sql语句练习50题
Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) ...
- 【转载】 HDU 动态规划46题【只提供思路与状态转移方程】
1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数) ...
- 转载 - 最短路&差分约束题集
出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★ ...
- 数论,质因数,gcd——cf1033D 好题!
直接筛质数肯定是不行的 用map<ll,ll>来保存质因子的指数 考虑只有3-5个因子的数的组成情况 必定是a=pq or a=p*p or a=p*p*p or a=p*p*p*p 先用 ...
- CodeForces - 1047CEnlarge GCD(这题很难,快来看题解,超级详细,骗浏览量)
C. Enlarge GCD time limit per test1 second memory limit per test256 megabytes inputstandard input ou ...
- ACM 刷题小技巧【转】
转载自URl-team ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好 ...
- [NOIp 2009]Hankson的趣味题
Description Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课 ...
- 【HDU4947】GCD Array (莫比乌斯反演+树状数组)
BUPT2017 wintertraining(15) #5H HDU- 4947 题意 有一个长度为l的数组,现在有m个操作,第1种为1 n d v,给下标x 满足gcd(x,n)=d的\(a_x\ ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
随机推荐
- 《C和指针》 读书笔记 -- 第11章 动态内存分配
1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...
- ubuntu安装oracle java
通常UBUNTU源中带有openjava,但在使用eclipse与android studio时经常会有莫名奇妙的问题,所以个人觉得还是用oracle java,省点心. 安装步骤如下: sudo a ...
- Mysql 如何删除数据表中的重复数据!
1.使用distinct查询所有不重复的记录 2.创建数据表相同结构的临时表,将第一步的数据复制进去 create temporary table if not exists student_temp ...
- EXTJS 4.2 资料 控件之tabpanel 静态生成tabpanel
//**************页面主体开始***************** var tabpanel = Ext.createWidget('tabpanel', { activeTab: 0, ...
- 【BZOJ 1877】 [SDOI2009]晨跑
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十 ...
- 团体程序设计天梯赛-练习集L1-024. 后天
L1-024. 后天 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 如果今天是星期三,后天就是星期五:如果今天是星期六,后天就 ...
- python:Attempted relative import in non-package
problem:Attempted relative import in non-package 所谓相对路径其实就是相对于当前module的路径,但如果直接执行脚本,这个module的name就是“ ...
- poj 2065 SETI 高斯消元
看题就知道要使用高斯消元求解! 代码如下: #include<iostream> #include<algorithm> #include<iomanip> #in ...
- eclipse代码自动提示功能设置
一 般默认情况下,Eclipse ,MyEclipse的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...
- Android:删除模拟器中没用的应用
进入模拟器,Setting->apps ->找到相应的app,选择uninstall 即可!