bzoj 2301(1101) [HAOI2011]Problem b 莫比乌斯反演+分段优化
来源:互联网 发布:mars安卓视频教程源码 编辑:程序博客网 时间:2024/06/04 01:23
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
Sample Output
14
3
HINT
100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000
传送门
1101有双倍经验的说……
这题算是经典题了吧……之前代码基本就是抄的,根本不懂,
今天终于来补了一下。。
这题要求的其实就是:
x和y同除以K,则问题转化为
经典问题辣!现在终于会辣=v=!
设f(i)表示
设F(i)表示
那么对于F(n),显然有:
接下来使用莫比乌斯反演定理,
莫比乌斯反演的证明等等可以百度搜索,具体2种形式如下:
那么这题显然是第二种形式了,我们得到:
对于下面的式子我们发现,可以O(N)求出答案,
那么总时间复杂度O(TN),T为数据组数。这题却会TLE。
如何优化呢?对于形如
我们一般都有一个“分块优化”,因为这个式子的值数只有O(
或者确切一点,2
那么也就是说总有一段是一样的,如何算最长的值为一样的一段呢?
答案是
因为我们知道
x表示的是能够使得
那么x既然最小,再除一次就变成上界了。
每次在
记录为last,那么(i~last)的
那么i每次更新为last+1即可,
为了快速求出这一段莫比乌斯函数的和,
之前用个线性筛+前缀和就好了,
这样就优化到了O(
好题啊,经典题!
分段优化也很经典的!
#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn=50005;int prime[maxn/7],mu[maxn],summu[maxn];bool notprime[maxn];void Get_mu(){ notprime[1]=1,mu[1]=1; int pcnt=0; for (int i=2;i<maxn;i++){ if (!notprime[i]) mu[i]=-1,prime[++pcnt]=i; for (int j=1;j<=pcnt;j++){ if (i*prime[j]>=maxn) break; notprime[i*prime[j]]=1; if (i%prime[j]) mu[i*prime[j]]=-mu[i]; else{ mu[i*prime[j]]=0; break; } } } summu[0]=0; for (int i=1;i<maxn;i++) summu[i]=summu[i-1]+mu[i];}ll calc(int n,int m){ int tmp=min(n,m),last; ll ans=0LL; for (int i=1;i<=tmp;i=last+1){ last=min(n/(n/i),m/(m/i)); ans+=(ll)(summu[last]-summu[i-1])*(n/i)*(m/i); } return ans;}ll ANS(int a,int b,int c,int d,int K){ a--,c--; a/=K,b/=K,c/=K,d/=K; return calc(b,d)-calc(a,d)-calc(b,c)+calc(a,c);}int main(){ Get_mu(); int cas;scanf("%d",&cas); int a,b,c,d,K; while (cas--){ scanf("%d%d%d%d%d",&a,&b,&c,&d,&K); printf("%lld\n",ANS(a,b,c,d,K)); } return 0;}
- bzoj 2301(1101) [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(莫比乌斯反演,分块,容斥)
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
- BZOJ 2301: [HAOI2011]Problem b(容斥原理+莫比乌斯反演)
- BZOJ 2301: [HAOI2011]Problem b 容斥+莫比乌斯反演
- 树状数组 详解
- Projection of Bumpy Surfaces凹凸曲面投影
- 图像处理的变分法研究(1)——11月第一阶段进展报告
- django gunicorn启动配置
- 谷歌插件安装
- bzoj 2301(1101) [HAOI2011]Problem b 莫比乌斯反演+分段优化
- java中queue的使用
- AS gradle 中Failed to resolve:com.android.support:appcompat-v7:报错处理
- 上拉加载和下拉刷新(XListView)
- 根据读取后台配置(前端动态化展示table.)
- testng源码阅读之四
- MySQL忘记root密码解决
- Python之异常处理
- spring表单标签