bzoj2301

题意

求区间 [a, b] 和 区间 [c, d] 有多少对数 (x, y) 使得 gcd(x, y) = k 。

分析

参考ppt

参考blog

考虑用容斥分成四次查询,

对于每次查询区间 [1, n] [1, m] 有多少对数使得 gcd = k ,等价于 [1, m / k] [1, n / k] 使得 gcd = 1。

考虑函数 F(k) = (n / k) * (m / k) 表示区间 [1, n] [1, m] 使得 gcd(x, y) 为 k 的倍数的个数。

函数 f(k) 表示区间 [1, n] [1, m] 使得 gcd(x, y) 为 k 的个数。

$ F(d) = \sum_{k\mid d}f(k) => f(k) = \sum_{k\mid d}\mu(\frac d k)F(d) $

f(1) 即为答案。

算法还需要优化,考虑 n / k 这个函数,当 k 越大变化越趋于平缓,也就是说一个整数值会对应一个连续的 k 值区间,对于这些相同的值可以预处理 \(\mu\) 函数前缀和,对于 n 和 m 存在公共连续区间的部分 F 函数值不变,直接全部加上即可。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
int not_prime[MAXN];
int prime[MAXN];
int mu[MAXN];
void getMu() {
mu[1] = 1;
int cnt = 0;
for(int i = 2; i < MAXN; i++) {
if(!not_prime[i]) {
prime[cnt++] = i;
mu[i] = -1;
}
for(int j = 0; i * prime[j] < MAXN; j++) {
not_prime[i * prime[j]] = 1;
if(i % prime[j] == 0) {
mu[i * prime[j]] = 0;
break;
}
mu[i * prime[j]] = -mu[i];
}
}
for(int i = 1; i < MAXN; i++) mu[i] += mu[i - 1]; // 前缀和
}
ll cal(int m, int n, int k) {
int last;
m /= k; n /= k;
ll s = 0;
for(int i = 1; i <= min(n, m); i = last + 1) {
last = min(n / (n / i), m / (m / i));
s += (ll)(mu[last] - mu[i - 1]) * (m / i) * (n / i);
}
return s;
}
int main() {
getMu();
int T;
scanf("%d", &T);
while(T--) {
int a, b, c, d, k;
scanf("%d%d%d%d%d", &a, &b, &c, &d, &k);
printf("%d\n", cal(b, d, k) - cal(a - 1, d, k) - cal(b, c - 1, k) + cal(a - 1, c - 1, k));
}
return 0;
}

bzoj2301(莫比乌斯反演)的更多相关文章

  1. BZOJ2301 莫比乌斯反演

    题意:a<=x<=b,c<=y<=d,求满足gcd(x,y)=k的数对(x,y)的数量         ((x,y)和(y,x)不算同一个) 比hdu1695多加了个下界,还有 ...

  2. 【BZOJ2301】【HAOI2011】Problem B(莫比乌斯反演)

    [BZOJ2301][HAOI2011]Problem B(莫比乌斯反演) 题面 Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y ...

  3. [BZOJ1101&BZOJ2301][POI2007]Zap [HAOI2011]Problem b|莫比乌斯反演

    对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. 我们可以令F[n]=使得n|(x,y)的数对(x,y)个数 这个很容易得到,只需要让x, ...

  4. BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块

    问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...

  5. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  6. BZOJ2301: [HAOI2011]Problem b 莫比乌斯反演

    分析:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 然后对于求这样单个的gcd(x,y)=k的, ...

  7. bzoj2301(莫比乌斯反演+分块)

    传送门:2301: [HAOI2011]Problem b 题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y ...

  8. [HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]

    题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? ...

  9. bzoj2301 [HAOI2011]Problem b【莫比乌斯反演 分块】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 很好的一道题.首先把每个询问转化为4个子询问,最后的结果就是这四个子询问的记过加加减减 ...

  10. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

随机推荐

  1. Dapper 学习笔记

    一.基础 1.Dapper代码就一个SqlMapper.cs文件, 前人测试Dapper速度较快 的Orm,读取速度接近IDataReader,超过DataTable. 2.a.下载地址 https: ...

  2. Freemarker 语法详解

    Freemarker 在线中文官方参考手册 Freemarker是一款模板引擎,是一种基于模版生成静态文件的通用工具,它是使用纯java编写的,一般用来生成HTML页面. Freemarker 生成静 ...

  3. php中各种操作字符串和时间戳的代码关键词

    <?php/** * Created by 郭鹏. * User: msi * Date: 2017/9/27 * Time: 14:17 */ //随机数生成器echo rand();echo ...

  4. 【python基础】--常用数据结构

    list tuple dict set四种常用数据结构 list list 有序的集合,可以随时添加.删除其中元素值; 支持list嵌套模式, >>> p = ['a','b']&g ...

  5. [译]如何去除pandas dataframe里面的Unnamed的列?

    原文来源: https://stackoverflow.com/questions/43983622/remove-unnamed-columns-in-pandas-dataframe 问:我有一个 ...

  6. 安卓自动化robotium工具简单使用(二)

    在学习安卓的这段时间里,刚好有个朋友有一个APP的应用需要开发. 我马上就动手开始做着试试,在完成开发的同时写了相应的自动化测试代码,使用的是robotium. 才接触安卓没几天,写的不太好,如果有好 ...

  7. Python洗牌算法重写

    Python有自带的洗牌算法函数shuffle(). 自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(4)的例子: import random def shuffle ...

  8. IE6对!important单个的类是支持的

    "!important"是什么? 第一个,是设置样式的优先级,设了!important的样式的属性优先于id选择器和class选择器.,比如id为"Main"的 ...

  9. Codeforces:Good Bye 2018(题解)

    Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...

  10. 原生js提取非行间样式

    js用style属性可以获得html标签的样式,但是不能获取非行间样式,如何获取css的非行间样式呢,在低版本ie我们可以用currentStyle,在其他浏览器我们可以用getComputedSty ...