BZOJ 2301: [HAOI2011]Problem b(莫比乌斯反演 + 容斥原理 + 分块优化)
来源:互联网 发布:淘宝客二合一转换软件 编辑:程序博客网 时间:2024/05/04 16:06
传送门
Problem 2301. – [HAOI2011]Problem b
2301: [HAOI2011]Problem b
Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 3671 Solved: 1643
[Submit][Status][Discuss]
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
解题思路:
首先我们可以看一下这个题目传送门 ,HDU这个题比BZOJ这个题简单,这个题目
首先利用容斥原理将这个答案拆分成四个询问,每次询问都是有多少个数对
多少个数对
的数对个数,令
经过莫比乌斯反演之后得到:
/**2016 - 08 - 17 晚上Author: ITAKMotto:今日的我要超越昨日的我,明日的我要胜过今日的我,以创作出更好的代码为目标,不断地超越自己。**/#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <queue>#include <algorithm>#include <set>using namespace std;typedef long long LL;typedef unsigned long long ULL;const int INF = 1e9+5;const int MAXN = 1e5+5;const int MOD = 1e9+7;const double eps = 1e-7;const double PI = acos(-1);using namespace std;LL Scan_LL()///输入外挂{ LL res=0,ch,flag=0; if((ch=getchar())=='-') flag=1; else if(ch>='0'&&ch<='9') res=ch-'0'; while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0'; return flag?-res:res;}int Scan_Int()///输入外挂{ int res=0,ch,flag=0; if((ch=getchar())=='-') flag=1; else if(ch>='0'&&ch<='9') res=ch-'0'; while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0'; return flag?-res:res;}void Out(LL a)///输出外挂{ if(a>9) Out(a/10); putchar(a%10+'0');}LL mu[MAXN], p[MAXN], k;bool prime[MAXN];void Mobius(){ memset(prime, 0, sizeof(prime)); mu[1] = 1, mu[0] = 0; k = 0; for(int i=2; i<MAXN; i++) { if(!prime[i]) { p[k++] = i; mu[i] = -1; } for(int j=0; j<k&&i*p[j]<MAXN; j++) { prime[i*p[j]] = 1; if(i%p[j] == 0) { mu[i*p[j]] = 0; break; } mu[i*p[j]] = -mu[i]; } } for(int i=1; i<MAXN; i++) mu[i] += mu[i-1];}int kk;LL Solve(int m, int n){ LL ret = 0; m /= kk, n /= kk; int tp = 0; for(int i=1; i<=m&&i<=n; i=tp+1) { tp = min(n/(n/i),m/(m/i)); ret += (mu[tp]-mu[i-1])*(m/i)*(n/i); } return ret;}int main(){ Mobius(); int T, a, b, c, d; scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d",&a,&b,&c,&d,&kk); LL ans = Solve(b, d) - Solve(a-1, d) + Solve(a-1, c-1) - Solve(b, c-1); 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] Problem b【莫比乌斯反演/容斥原理/分块】
- BZOJ 2301: [HAOI2011]Problem b 容斥+莫比乌斯反演
- [BZOJ 2301][HAOI2011]Problem b:莫比乌斯反演+容斥
- BZOJ 2301 Problem b (莫比乌斯反演+区间容斥+分块)
- [莫比乌斯反演+容斥+分块求和] BZOJ2301: [HAOI2011]Problem b
- 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 莫比乌斯反演
- 正则表达式和list set集合
- 在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便。这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结
- oracle
- JavaScript基本概念 汇总
- zzulioj1915:查找重复点
- BZOJ 2301: [HAOI2011]Problem b(莫比乌斯反演 + 容斥原理 + 分块优化)
- android异常:Can not perform this action after onSaveInstance
- 找女朋友
- android 消息机制
- 【数论】hdu5584 LCM walk(数学推导)
- 【杭电1179】二分图
- JZOJ4709 matrix 组合数
- intellij idea关闭重复代码提醒
- zzuli1918 (二分图 坑)