bzoj 2301 [HAOI2011]Problem b (莫比乌斯反演)
来源:互联网 发布:mac怎么下载r语言 编辑:程序博客网 时间:2024/06/06 01:09
Description
对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。
Input
第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、k
Output
共n行,每行一个整数表示满足要求的数对(x,y)的个数
Sample Input
2
2 5 1 5 1
1 5 1 5 2
2 5 1 5 1
1 5 1 5 2
Sample Output
14
3
HINT
100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000
题意:给定两个数x,y, a <= x <= b, c <= y <= d,让你求有多少对gcd(x,y) == k。gcd(x,y) 和 gcd(y,x)算两对。
我们前面做过求 [1,b] 区间与 [1,d] 区间的 gcd(x,y) == k的题(如果没做过,请点击这里)。
我们先令:
a = (a-1)/k;
b = b/k;
c = (c-1)/k;
d = d/k;
这题我们可以先求出[1,b] 与 [1,d]的答案,但是这里会有重复,因为[1,a] 和 [1,c]区间都不在范围内,这里面就多算了 [1,a] 与 [1,c] 、[1,a]与[1,d] 、 [1,c]与[1,b],
所以最后的答案就是 solve(b,d) - solve(a,d) - solve(c,b) + solve(a,c); (因为[1,a] 与 [1,c] 这个区间被减了两次,所以加上一次)
而且这题数据组数很多,所以得分块处理,对于一个i,到min(b/(b/i),d/(d/i))这一段的值都是一样的,所以一起加到答案上就行了,提前处理一下莫比乌斯函数的前缀和。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn = 1e5 + 10;int p[maxn/10];int flag[maxn];int mu[maxn];int cnt = 0;int sum[maxn];void init(){ int i,j; mu[1] = 1; for(i=2;i<maxn;i++) { if(!flag[i]) { p[cnt++] = i; mu[i] = -1; } for(j=0;j<cnt&&p[j]*i<maxn;j++) { flag[p[j]*i] = 1; if(i % p[j] == 0) { mu[p[j]*i] = 0; break; } mu[p[j]*i] = -mu[i]; } } for(i=1;i<maxn;i++) sum[i] = sum[i-1] + mu[i];}LL solve(int b,int d){ LL ans = 0; for(int i=1,last = 0;i<=min(b,d);i=last+1) { last = min(b/(b/i),d/(d/i)); ans += (LL)(b/i)*(d/i)*(sum[last]-sum[i-1]); } return ans;}int main(void){ int T,a,b,c,d,k,i,j; init(); scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); a = (a-1)/k; b = b/k; c = (c-1)/k; d = d/k; LL ans = solve(b,d) - solve(a,d) - solve(c,b) + solve(a,c); printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- [BZOJ 2301][HAOI2011] Problem b 莫比乌斯反演
- bzoj 2301: [HAOI2011]Problem b 【莫比乌斯反演】
- BZOJ 2301: [HAOI2011]Problem b - 莫比乌斯反演
- [莫比乌斯反演] BZOJ 2301 [HAOI2011]Problem b
- BZOJ 2301: [HAOI2011]Problem b【莫比乌斯反演
- bzoj 2301: [HAOI2011]Problem b 莫比乌斯反演
- bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演)
- BZOJ 2301: [HAOI2011]Problem b (莫比乌斯反演)
- BZOJ 2301: [HAOI2011]Problem b(莫比乌斯反演 + 容斥原理 + 分块优化)
- BZOJ 2301: [HAOI2011]Problem b(莫比乌斯反演,分块,容斥)
- BZOJ 2301 [HAOI2011]Problem b (莫比乌斯反演)
- 莫比乌斯反演(bzoj 2301: [HAOI2011]Problem b)
- BZOJ 2301 [HAOI2011]Problem b (莫比乌斯反演)
- bzoj 2301 [HAOI2011]Problem b (莫比乌斯反演)
- BZOJ 2301 HAOI2011 Problem b 容斥原理+莫比乌斯反演
- 莫比乌斯反演 bzoj 2301: [HAOI2011]Problem b模板
- 莫比乌斯反演入门 HDOJ 1695:GCD 、BZOJ 2301: [HAOI2011]Problem b
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
- SpringMVC从入门到精通(二)
- 飞思卡尔IMX6处理器的GPIO配置方式
- Java常见的辅助函数使用
- 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
- vue编写messageBox,使用函数调用
- bzoj 2301 [HAOI2011]Problem b (莫比乌斯反演)
- You should consider upgrading via the 'pip install --upgrade pip' command.
- git常见问题之git push -u origin master时failed to push some refs to
- python 2进制字符串拼接查找
- QTP/UFT 学习笔记
- AsyncTask网络请求数据
- 代理模式之动态代理
- C语言学习:函数
- 5 分钟理解 https 工作流程