【题解】Luogu P2522 [HAOI2011]Problem b
原题传送门
这题需要运用莫比乌斯反演(懵逼钨丝繁衍)
我们看题面,让求对于区间\([a,b]\)内的整数x和\([c,d]\)内的y,满足$ gcd(x,y)=k$的数对的个数
我们珂以跟容斥原理(二维前缀和)一样来求答案:
设\(solve(x,y,k)\)表示对于区间\([1,x]\)内的整数x和\([1,y]\)内的y,满足\(gcd(x,y)=k\)的数对的个数
那么答案\(ans=solve(b,d,k)-solve(a-1,d,k)-solve(b,c-1,k)+solve(a-1,c-1,k)\)
那么solve怎么写呢?
设F(n)表示满足\(gcd(x,y)\%t=0\)的数对个数,f(t)表示满足\(gcd(x,y)=t\)的数对个数,实际上答案就是f(k)
这就满足莫比乌斯反演的关系式了
显然我们珂以得知\(F(t)=(b/t)*(d/t)\)
我们根据反演的第二个公式便珂以得出
$$f(k)=\sum_{n|k}\mu(\frac{k}{n})F(k)$$
再加上整除分块就珂以了
#include <bits/stdc++.h>
#define N 50005
#define ll long long
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register ll x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
int miu[N],v[N],sum[N];
inline ll solve(register int a,register int b,register int k)
{
int maxround=Min(a/k,b/k);
ll ans=0;
for(register int l=1,r;l<=maxround;l=r+1)
{
r=Min((a/k)/((a/k)/l),(b/k)/((b/k)/l));
ans+=(ll)((a/k)/l)*((b/k)/l)*(sum[r]-sum[l-1]);
}
return ans;
}
int main()
{
for(register int i=1;i<=N;++i)
miu[i]=1,v[i]=0;
for(register int i=2;i<=N;++i)
{
if(v[i])
continue;
miu[i]=-1;
for(register int j=i<<1;j<=N;j+=i)
{
v[j]=1;
if((j/i)%i==0)
miu[j]=0;
else
miu[j]*=-1;
}
}
for(register int i=1;i<=N;++i)
sum[i]=sum[i-1]+miu[i];
int t=read();
while(t--)
{
int a=read()-1,b=read(),c=read()-1,d=read(),k=read();
ll ans=solve(b,d,k)-solve(a,d,k)-solve(b,c,k)+solve(a,c,k);
write(ans),puts("");
}
return 0;
}
【题解】Luogu P2522 [HAOI2011]Problem b的更多相关文章
- Luogu P2522 [HAOI2011]Problem b
如果你做过[Luogu P3455 POI2007]ZAP-Queries就很好办了,我们发现那一题求的是\(\sum_{i=1}^a\sum_{j=1}^b[\gcd(i,j)=d]\),就是这道题 ...
- Luogu P2522 [HAOI2011]Problem b 莫比乌斯反演
设$f(d)=\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)==d],\\F(n)=\sum_{n|d}f(d)=\lfloor \frac{N}{n} \rfloor \lflo ...
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...
- 洛谷P2522 - [HAOI2011]Problem b
Portal Description 进行\(T(T\leq10^5)\)次询问,每次给出\(x_1,x_2,y_1,y_2\)和\(d\)(均不超过\(10^5\)),求\(\sum_{i=x_1} ...
- [luogu] P2519 [HAOI2011]problem a (贪心)
P2519 [HAOI2011]problem a 题目描述 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同 ...
- Luogu P2519 [HAOI2011]problem a
题目链接 \(Click\) \(Here\) \(DP\)神题.以后要多学习一个,练一练智商. 关键点在于把"有\(a_i\)个人分数比我高,\(b_i\)个人分数比我低"这句话 ...
- P2522 [HAOI2011]Problem b
还有三倍经验的吗(窒息) 思路 其实就是P3455套了个简单的容斥 把问题转化成f(n,m,k)-f(a-1,m,k)-f(n,b-1,k)+f(a-1,b-1,k)就可以了 和p3455几乎一样的代 ...
- 题解【bzoj2301 [HAOI2011]Problem b】
Description 求有多少个数对 \((x,y)\) ,满足$ a \leq x \leq b$ ,\(c \leq y \leq d\) ,且 \(\gcd(x,y) = k\),\(\gcd ...
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...
随机推荐
- 遇到问题---hosts不起作用问题的解决方法
c:\WINDOWS\system32\drivers\etc\hosts 文件的作用是添加 域名解析 定向 比如添加 127.0.0.1 www.baidu.com 那我们访问www.baidu. ...
- 笔记本(ThinkPad)怎样关闭触摸板
随着笔记本电脑的普及,人们越来越习惯于出门使用笔记本,笔记本的便捷高效也大幅度地提升了人们的工作效率.但是如果居家使用笔记本电脑,也有其不便之处.比如在键盘上打字,很容易就会喷到触摸板,以至于光标一下 ...
- 数据加密之DES加密
DES加密即使用DESCryptoServiceProvider加密.DESCryptoServiceProvider在命名空间下:System.Security.Cryptography; 对称加密 ...
- 那种多空计算方法更正确呢?——从此图看应该是TEST005
那种方法计算多空逆转更正确呢?——从此图1看应该是TEST005,但是实际上是ZCL_多空! TEST005具有滞后性!也就是说跌了一些在报警,可能已经跌了10%(如图2) ZCL_多空:当计算结果和 ...
- node.js初识08
1.模块的概念,在前端的世界里,jq和js的关系,在后台里就是express和原生node的关系, 2.每一个js里的函数都只在当前文件里起作用,如果你希望在其他js里调用这个函数,这么你需要在这个j ...
- MFC CEdit控件 自动换行
属性设置: Auto HScroll : False Auto VScroll : True Multiline : Ture Want Return : Ture 亲自测试,值得信赖!
- rpgmakermv(10) GraphicalDesignMode
插件地址:https://github.com/triacontane/RPGMakerMV/blob/master/GraphicalDesignMode.js 原文: メニュー画面や戦闘画面など各 ...
- 代码审查Code Review
代码审查清单 常规项 代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. 所有的代码是否简单易懂? 代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注 ...
- Vue系列之 => 模拟购物车添加小球动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 擠出機步進馬達的 Steps per Unit 該如何計算?
擠出機步進馬達的 Steps per Unit 該如何計算? 這邊 Steps per Unit 指的是塑料往前推進1mm,步進馬達須要走幾步.依此定義,可知計算方式可以用 步進馬達轉一圈需要的步 ...