BZOJ 2301 Problem b(莫比乌斯反演+分块优化)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166
题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。
思路:本题使用莫比乌斯反演要利用分块来优化,那么每次询问的复杂度降为2*sqrt(n)+2*sqrt(m)。注意到 n/i ,在连续的k区间内存在,n/i=n/(i+k)。所有对这连续的区间可以一次求出来,不过要先预处理mu的前n项和。
code:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 typedef long long LL; 6 const int MAXN = 50005; 7 8 bool check[MAXN]; 9 int primes[MAXN]; 10 int mu[MAXN]; 11 int sum[MAXN]; 12 LL a, b, c, d, k; 13 14 void moblus() 15 { 16 memset(check, false, sizeof(check)); 17 mu[1] = 1; 18 int cnt = 0; 19 for (int i = 2; i < MAXN; ++i) { 20 if (!check[i]) { 21 primes[cnt++] = i; 22 mu[i] = -1; 23 } 24 for (int j = 0; j < cnt; ++j) { 25 if (i * primes[j] > MAXN) break; 26 check[i * primes[j]] = true; 27 if (i % primes[j] == 0) { 28 mu[i * primes[j]] = 0; 29 break; 30 } else { 31 mu[i * primes[j]] = -mu[i]; 32 } 33 } 34 } 35 sum[0] = 0; 36 for (int i = 1; i < MAXN; ++i) { 37 sum[i] = sum[i - 1] + mu[i]; 38 } 39 } 40 41 LL cal(LL n, LL m) 42 { 43 if (n > m) swap(n, m); 44 n /= k; 45 m /= k; 46 LL ret = 0; 47 for (int i = 1, la = 0; i <= n; i = la + 1) { 48 la = min(n/(n/i), m/(m/i)); 49 ret += (n / i) * (m / i) * (sum[la] - sum[i - 1]); 50 } 51 return ret; 52 } 53 54 int main() 55 { 56 moblus(); 57 int nCase; 58 scanf("%d", &nCase); 59 while (nCase--) { 60 scanf("%lld %lld %lld %lld %lld", &a, &b, &c, &d, &k); 61 LL ans = cal(b, d) - cal(a - 1, d) - cal(b, c - 1) + cal(a - 1, c - 1); 62 printf("%lld\n", ans); 63 } 64 return 0; 65 }
转载于:https://www.cnblogs.com/ykzou/p/4793714.html
BZOJ 2301 Problem b(莫比乌斯反演+分块优化)相关推荐
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)
URL: (Luogu)https://www.luogu.org/problem/show?pid=3455 (BZOJ)http://www.lydsy.com/JudgeOnline/probl ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 4032 Solved: 1817 [Submi ...
- [POI2007]ZAP-Queries [HAOI2011]Problem b 莫比乌斯反演
1,[POI2007]ZAP-Queries ---题面--- 题解: 首先列出式子:$$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}[gcd(i, j) == d]$ ...
- ACdream 1148(莫比乌斯反演+分块)
传送门:GCD SUM 题意:给出N,M 执行如下程序: long long ans = 0,ansx = 0,ansy = 0; for(int i = 1; i <= N; i ++) ...
- BZOJ 2301 - Problem b(莫比乌斯反演+容斥)
题目链接 https://cn.vjudge.net/problem/HYSBZ-2301 [题意] 对于给出的 n 个询问,每次求有多少个数对(x,y)(x,y) ,满足 a≤x≤b,c≤y≤da≤ ...
- P2522 HAOI2011 Problem b [莫比乌斯反演,数论分块]
P2522 HAOI2011 题意 对于给出的n个询问,每次求有多少个数对(x,y)(x,y)(x,y),满足a≤x≤ba≤x≤ba≤x≤b,c≤y≤dc≤y≤dc≤y≤d,且gcd(x,y)=kgc ...
- BZOJ 2301 Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 7576 Solved: 3643 [Submi ...
- BZOJ 1101: [POI2007]Zap( 莫比乌斯反演 )
求 answer = ∑ [gcd(x, y) = d] (1 <= x <= a, 1 <= y <= b) . 令a' = a / d, b' = b / d, 化简一下得 ...
- HDU 6833 A Very Easy Math Problem(莫比乌斯反演)
原题题面 Given you n,x,k , find the value of the following formula: ∑ a 1 = 1 n ∑ a 2 = 1 n . . . ∑ a x ...
最新文章
- 基于FPGA的ADC和DAC设计
- jsonp-反向代理-CORS解决JS跨域问题的个人总结
- .NET 开源项目 StreamJsonRpc 介绍[下篇]
- python去重计数_用Python实现透视表的value_sum和countdistinct功能
- 安卓gridview条目点击事件_敬业签的安卓手机版设置便签按正序排序教程
- CCF NOI1020 数字识别
- matlab 插值出错,MATLAB插值问题
- OV5640摄像头简介、硬件电路及上电控制
- 设置图片在Unity中的默认打开方式
- 技术方案|高精密划片机
- 考研数据结构——买卖青蛙
- 一年半的桌面运维经验小结,欢迎有类似经历的伙伴评论交流
- 刘禹锡最经典诗文10首,每一首都是千古名作,读懂受益一生
- 两角和与差的正弦、余弦、正切公式推导
- 浅谈用户行为分析(一)
- 【鸿蒙】HiSpark Wifi IOT开发板资料汇总
- omnigraffle 画曲线_三步学会用绘图利器 OmniGraffle 绘制流程图
- 窄页面,轧后出现空白?啊哈哈,我来帮你忙~~
- Blast中文手册(3)
- 披着数据分析师的外衣,干着鱼龙混杂的活
热门文章
- C++(STL):03---智能指针之shared_ptr
- 算法(17)-leetcode-剑指offer1
- 用Docker容器自带的tensorflow serving部署模型对外服务
- 《Python Cookbook 3rd》笔记(5.1):读写文本数据
- 百度关键词排名查询源码_章丘百度霸屏总部,关键词排名腾沃云
- 密码学专题 鉴别协议|实际应用的混合协议
- 最易忽视的肾虚4件事
- C/C++ main用法总结
- 多线程原理实例应用详解
- 何必言精通——十年杂感