BZOJ 2301 Problem b
来源:互联网 发布:风险数据集市 编辑:程序博客网 时间:2024/05/22 07:01
题目传送门
这个问题等价于询问有多少个数对(x,y)满足l<=x<=floor(n/k),1<=y<=floor(m/k)且x与y互质
首先我们根据容斥原理将一个询问拆分为四个询问即ans=f(b,d)-f(a-1,d)-f(b,c-1)+f(a-1,c-1)
f(i)为gcd(x,y)=i的个数(1<=x<=n,1<=y<=m)
我们令F(i)为i|gcd(x,y)的个数(1<=x<=n,1<=y<=m)
则可以得到
又因为
这样做是O(n)的,但因为是多组询问所以依旧会T掉。
所以我们需要一个有效的时间优化。
通过观察我们可以发现,
通过上表,可知第三四行的前两列完全一样,所以我们可以求出莫比乌斯函数的前缀和,然后通过一步算出。
for(int i=1;i<=x;i=last+1) { last=min(x/(x/i),y/(y/i)); ans+=(x/i)*(y/i)*(sum[last]-sum[i-1]); }
sum数组就是我们所求的前缀和,last相当于是找一个符合条件的位置。
完整代码如下:
#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 50000using namespace std;int a,b,c,d,k;int miu[MAXN+5],prime[MAXN+5],sum[MAXN+5];void Init(){ miu[1]=1; int cnt=0; bool check[MAXN+5]; memset(check,0,sizeof check); for(int i=2;i<=MAXN;i++) { if(!check[i]) { prime[++cnt]=i; miu[i]=-1; } for(int j=1;j<=cnt;j++) { if(prime[j]*i>MAXN) break; check[prime[j]*i]=1; if(i%prime[j]==0) { miu[i*prime[j]]=0; break; } miu[i*prime[j]]=-miu[i]; } } for(int i=1;i<=MAXN;i++) sum[i]=sum[i-1]+miu[i];}int num(int x,int y){ x/=k; y/=k; int ans=0,last; if(x>y) swap(x,y); for(int i=1;i<=x;i=last+1) { last=min(x/(x/i),y/(y/i)); ans+=(x/i)*(y/i)*(sum[last]-sum[i-1]); } return ans;}int main(){ Init(); int T; scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); printf("%d\n",num(b,d)-num(a-1,d)-num(b,c-1)+num(a-1,c-1)); }}
阅读全文
0 0
- bzoj-2301 Problem b
- 【BZOJ】2301 Problem b
- BZOJ 2301 Problem b
- BZOJ 2301: [HAOI2011]Problem b
- bzoj 2301: [HAOI2011]Problem b
- 【BZOJ 2301】 [HAOI2011]Problem b
- bzoj 2301: [HAOI2011]Problem b
- Problem b [Bzoj 2301,HAOI2011]
- 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
- git clone 过慢科学加快速度
- 留着以后慢慢做的DP
- 虚函数与构造函数、析构函数
- 排坑!java操作hadoop中的hdfs文件系统
- 安装ubuntu16.04过程中可能遇到的问题
- BZOJ 2301 Problem b
- 【二叉树】判断二叉树是否为平衡二叉树
- C++黑魔法系列1:进击的define
- c++学习博客
- 2017.7.11 机房测试(图论,网络流,最短路)
- Mac下编译OpenH264 for iOS
- 没有玄学,只有细节
- MySQL借助ibd文件恢复数据技巧?
- 《Effective C#》读书笔记