[Update] 我好像现在都看不懂我当时在写什么了=-=

\(Description\)

  求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\)

\(Solution\)

  首先是把下界作为1.可以化为求

\[\sum_{i=1}^{\lfloor\frac{N}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{M}{k}\rfloor}[(i,j)=1]
\]

说明:大概就我不能直接看出来了。。

  首先要求\([1,N]\)中有多少\(i,i|k\),再求[1,j]中有多少\(j,j|k且(i,j)=1\),显然这个\(i,j\)的上界就分别是\(\lfloor\frac{N}{k}\rfloor,\lfloor\frac{M}{k}\rfloor\),答案就是\((i,j)=1\)的\((i,j)\)数对个数。

  现在考虑如何求上面的式子。

  由莫比乌斯反演,有

\[F(d)=\sum_{d|n}f(n)\Leftrightarrow f(d)=\sum_{d|n}\mu(\frac{n}{d})F(n)
\]

  设\(f[i]\)为满足\(gcd(x,y)=i\)的\((x,y)\)对数,其中\(1\leq x\leq b,1\leq y\leq d\);

  \(F[i]\)为满足\(i|gcd(x,y)\)的\((x,y)\)对数,其中\(1\leq x\leq b,1\leq y\leq d\)。

  显然有\(F[i]=\sum_{i|n}f[n]\Rightarrow f[i]=\sum_{i|n}\mu(\frac{n}{i})F[n]\)

  又显然有\(F[i]=\lfloor\frac{b}{i}\rfloor\lfloor\frac{d}{i}\rfloor\),那么

\[f[i]=\sum_{i|n,1\leq n\leq min(b,d)}\mu(\frac{n}{i})\lfloor\frac{b}{n}\rfloor\lfloor\frac{d}{n}\rfloor
\]

  令\(k=\frac{n}{i}\),即\(n=ki\),令\(b'=\frac{b}{i},d'=\frac{d}{i}\),则

\[f[i]=\sum_{k=1}^{min(b',d')}\mu(k)\lfloor\frac{b'}{k}\rfloor\lfloor\frac{d'}{k}\rfloor
\]

  (本题i就是1。)

  上面这个式子还是\(O(n^2)\)的。。还是要分块计算。

/*
最后求解要容斥:(a,c为开区间,另外其实并不分左右)
ans=f[a~b,c~d]=f[b,d]-f[a,d]-f[b,c]+f[a,c]
*/
#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=5e4+3,MAXIN=1<<17; int cnt,P[N+2],mu[N+2],sum[N+2];
bool Not_P[N+2];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
void Init()
{
mu[1]=1;
for(int i=2;i<N;++i)
{
if(!Not_P[i]) P[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*P[j]<N;++j)
{
Not_P[i*P[j]]=1;
if(!(i%P[j])) {mu[i*P[j]]=0; break;}
mu[i*P[j]]=-mu[i];
}
}
for(int i=1;i<N;++i) sum[i]=sum[i-1]+mu[i];
}
int calc(int n,int m)
{
int t=std::min(n,m),ans=0;//应该不需要longlong
// for(int k=1;k<=t;++k) ans+=mu[k]*(n/k)*(m/k);//TLE:O(n^2)
for(int las,i=1;i<=t;i=las+1)
{
las=std::min(n/(n/i),m/(m/i));
ans+=(sum[las]-sum[i-1])*(n/i)*(m/i);
}
return ans;
} int main()
{
Init();
int t=read(),a,b,c,d,k;
while(t--)
a=read()-1,b=read(),c=read()-1,d=read(),k=read(),
a/=k,b/=k,c/=k,d/=k,printf("%d\n",calc(b,d)-calc(a,d)-calc(b,c)+calc(a,c));
return 0;
}

BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)的更多相关文章

  1. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  2. BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1007  Solved: 415[Submit][ ...

  3. BZOJ 2301 [HAOI2011]Problem b ——莫比乌斯反演

    分成四块进行计算,这是显而易见的.(雾) 然后考虑计算$\sum_{i=1}^n|sum_{j=1}^m gcd(i,j)=k$ 首先可以把n,m/=k,就变成统计&i<=n,j< ...

  4. BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  5. BZOJ 2301 Problem b (莫比乌斯反演+容斥)

    这道题和 HDU-1695不同的是,a,c不一定是1了.还是莫比乌斯的套路,加上容斥求结果. 设\(F(n,m,k)\)为满足\(gcd(i,j)=k(1\leq i\leq n,1\leq j\le ...

  6. bzoj 2301: [HAOI2011]Problem b mobius反演 RE

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301 设f(i)为在区间[1, n]和区间[1, m]中,gcd(x, y) = i的个数. 设F( ...

  7. BZOJ 2301 [HAOI2011]Problem b (分块 + 莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 6519  Solved: 3026[Submit] ...

  8. BZOJ 2301: [HAOI2011]Problem b (莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 436  Solved: 187[Submit][S ...

  9. 2301: [HAOI2011]Problem b ( 分块+莫比乌斯反演+容斥)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 6015  Solved: 2741[Submit] ...

随机推荐

  1. C++学习2--坦克大战编写-前置知识

    基础班学习的这一个多月里的前三周讲解基础的语法,最后一周需要做坦克大战的项目巩固提高自己掌握的语法知识.这个系列博文主要是为了把学习过程中的知识点总结并记录下来: 开发语言与开发工具:C++,VS20 ...

  2. JavaScript内置对象——Math对象

    这几天在刷leetcode的时候用到了一些Math对象的知识,故作一下总结~ JavaScript中的Math对象也是一个常见的内置对象,然而与String等其它常见对象不同,Math对象没有构造函数 ...

  3. python模块介绍- binascii:二进制和ASCII互转以及其他进制转换

    20.1 binascii:二进制和ASCII互转作用:二进制和ASCII互相转换. Python版本:1.5及以后版本 binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法.通 ...

  4. plsql developer导入导出序列方法

    导出: 1.打开PLSQL Developer,工具 2.类型排序,选中所有sequence,指定用户,单个文件,选择导出文件路径,等待执行完毕即可. 导入: 打开导出的文件,复制,在新打开的命令窗口 ...

  5. haproxy配置基于ssl证书的https负载均衡

    本实验全部在haproxy1.5.19版本进行测试通过,经过测试1.7.X及haproxy1.3版本以下haproxy配置参数可能不适用,需要注意版本号. 一.业务要求现在根据业务的实际需要,有以下几 ...

  6. dell R720服务器设置开机启动顺序

    开机按F2进入系统启动设置,也可以按F11进入快速启动配置

  7. Day5----------------------文件合并与文件归档

    一.文件合并 1.命令: >:覆盖式 >>:追加式 例如:cat /etc/passwd > a.txt      把/etc/passwd下的内容合并到a.txt内,若没有文 ...

  8. java 扫描输入

    到目前为止,从文件或标准输入读取数据还是一件相当痛苦第事情,一般第解决之道就是读入一行文本,对其进行分词,然后使用Integer Double 等类第各种解析方法来解析数据: //: strings/ ...

  9. PHP常见错误提示含义解释

    1.Notice: Undefined variable: 变量名 in 注:使用了一个没有被定义的变量 2.Parse error: syntax error, unexpected T_ELSE ...

  10. Gym100340 线性dp

    //看题解写的 https://blog.csdn.net/sdfzyhx/article/details/51804748#include<bits/stdc++.h> using na ...