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;
}

最新文章

  1. SQLite剖析之异步IO模式、共享缓存模式和解锁通知
  2. JQUERY相关
  3. hive问题整理(待续)
  4. C# SMTP邮件发送 分类: C# 2014-07-13 19:10 334人阅读 评论(1) 收藏
  5. edittext 监听内容变化
  6. HDU 4648 Magic Pen 6
  7. 列联表(Crosstabs)
  8. AMQ学习笔记 - 19. 问题解决 - 控制Atomikos的日志输出
  9. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE
  10. 在MVC中写Filter时经常filterContext无法代码提示HttpContext的方法和属性的原因
  11. 【Linux】鸟哥的Linux私房菜基础学习篇整理(三)
  12. 0130——UIScrollView
  13. CLR查找和加载程序集的方式(二) 流程图
  14. PHP面向对象之const常量修饰符
  15. js中let和var的区别 不懂得加QQ 2270312758
  16. Centos7安装Mysql5.7方法总结 - 实操手册
  17. Emmet.vim 教程
  18. BootStrap学习(6)_模态框
  19. java课堂动手动脑总结
  20. 复习回顾(String,StringBuffer,Arrays方法总结)

热门文章

  1. 《算法》C++代码 快速排序
  2. SQL Server VALUES 使用一记住
  3. js valueOf和toString方法
  4. CSS简易学习笔记
  5. Python-map、filter、reduce方法
  6. [译]如何禁止Requests库的log日志信息呢?
  7. J2EE的十三个技术——Servlet
  8. 使用pdb模块调试Python
  9. [bzoj] 2716 天使玩偶 || CDQ分治
  10. code forces Codeforces Round #487 (Div. 2) C