BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)
来源:互联网 发布:js图片轮播思路 编辑:程序博客网 时间:2024/06/11 19:40
URL: (Luogu)https://www.luogu.org/problem/show?pid=3455
(BZOJ)http://www.lydsy.com/JudgeOnline/problem.php?id=1101
题目大意:
有t次询问(
思路分析:
首先,需要注意的是,要特殊处理
对于
先将a/=d, b/=d, 因此只需求gcd(x,y)=1的数的对数。
令F[i]表示
根据莫比乌斯反演公式:
因此,
而显然我们有
可是这样还不够。算算复杂度,发现会TLE.
注意到一个性质: 对于
代码实现
#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int N = 5e4;const int NN = 317;int p[N+2];bool f[N+2];int mu[N+2];int s[N+2];int g[(NN<<2)+2];int h[(NN<<2)+2];int a,b,d,m;void Mobius(){ f[1] = true; mu[1] = 1; m = 0; for(int i=2; i<=N; i++) { if(!f[i]) {p[++m] = i; mu[i] = -1;} for(int j=1; p[j]*i<=N; j++) { f[p[j]*i] = true; if(i%p[j]==0) { mu[i*p[j]] = 0; break; } else mu[i*p[j]] = -mu[i]; } }}void merge(int aa,int bb){ int i = 1,j = (aa<<1)+1,k = 1; while(i<=(aa<<1) && j<=(aa<<1)+(bb<<1)) { if(h[i]<h[j]) g[k++] = h[i++]; else g[k++] = h[j++]; } while(i<=(aa<<1)) g[k++] = h[i++]; while(j<=(aa<<1)+(bb<<1)) g[k++] = h[j++];}int main(){ int t; scanf("%d",&t); Mobius(); s[0] = 0; for(int i=1; i<=N; i++) s[i] = s[i-1]+mu[i]; while(t--) { scanf("%d%d%d",&a,&b,&d); if(d==0) {printf("0\n"); continue;} if(a>b) swap(a,b); a /= d; b /= d; int aa = (int)sqrt(a),bb = (int)sqrt(b); long long ans = 0ll; for(int i=1; i<=aa; i++) h[i] = i; for(int i=aa; i>=1; i--) h[(aa<<1)-i+1] = a/i; //保证h[]在1~(aa<<1)范围内有序 for(int i=1; i<=bb; i++) h[i+(aa<<1)] = i; for(int i=bb; i>=1; i--) h[(aa<<1)+(bb<<1)-i+1] = b/i; //保证h[]在1~(bb<<1)范围内有序 merge(aa,bb); //将[1,aa<<1]与[aa<<1+1,aa<<1+bb<<1]归并起来 for(int i=1; i<=(aa<<1)+(bb<<1); i++) { ans += (long long)(s[g[i]]-s[g[i-1]])*(a/g[i])*(b/g[i]); } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)
- [BZOJ 1101] POI 2007 Zap · 莫比乌斯 & 分块 超详细题解
- 洛谷P3455 [POI2007]ZAP-Queries(莫比乌斯反演学习)
- BZOJ 1101 [POI2007]Zap 莫比乌斯反演
- BZOJ 1101: [POI2007]Zap|莫比乌斯反演
- [莫比乌斯反演] BZOJ 1101 [POI2007]Zap
- BZOJ 1101: [POI2007]Zap【莫比乌斯反演
- bzoj 1101 [POI2007]Zap 莫比乌斯反演
- BZOJ 1101: [POI2007]Zap 莫比乌斯反演
- BZOJ 1101 [POI2007]Zap 莫比乌斯反演
- BZOJ 1101: [POI2007]Zap 莫比乌斯反演
- bzoj 1101: [POI2007]Zap 莫比乌斯反演
- [BZOJ 1101][POI2007]Zap:莫比乌斯反演
- bzoj #1101 ZAP-Queries (莫比乌斯反演)
- 【BZOJ】【P1101】【POI2007】【Zap】【题解】【莫比乌斯反演】
- 【BZOJ】2301 [HAOI2011]Problem b && 【BZOJ】1101 [POI2007]Zap 莫比乌斯函数+数论分块
- 1101: [POI2007]Zap(莫比乌斯反演)
- bzoj 2301 -莫比乌斯函数反演+分块优化
- 【arduino】A4988驱动
- 在mybatis里面配置外部资源文件
- [LP对偶][含正权环的最大费用流] SRM 676 div1 1000pts Farmville
- dddddddd
- 如何更精准的找到你需要的开源库
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)
- Ruby插入排序的常规写法和递归写法
- Java基础学习总结(1)—Java编程语言概述及环境搭建
- redis安装和redis集群配置
- 如何访问虚拟机(另一台设备)上运行的 Web 项目
- Linux下配置JDK
- JDBC为什么要使用PreparedStatement而不是Statement
- 网络工程师成长日记162-网络工程师的定位
- project euler 10 Summation of primes