BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】_weixin_30911451的博客-程序员秘密

2301: [HAOI2011]Problem b

Time Limit: 50 Sec  Memory Limit: 256 MB
Submit: 4032  Solved: 1817
[ 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

Sample Output

14

3

HINT

100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000


研究了好长时间差不多明白了,第一道莫比乌斯反演,好多值得学习的东西

首先,由容斥原理易得答案为

cal(b,d,k)-cal(a-1,d,k)-cal(b,c-1,k)+cal(a-1,c-1,k)

  • 这个问题等价于询问有多少个数对(x,y)满足1<=x<=[n/k],1<=y<=[m/k]且x与y互质
  • 考虑莫比乌斯反演,
  • f(i)为1<=x<=n,1<=y<=m且gcd(x,y)=i的数对(x,y)的个数
  • F(i)为1<=x<=n,1<=y<=m且i|gcd(x,y)的数对(x,y)的个数
  • 显然,F(i)=(n/i)*(m/i) 整除,并且F(i)=Σ{i|d} f(d) 是倍数和
  • 反演后,f(i)=Σ{i|d} miu(d/i)*F(d)=Σ{i|d} miu(d/i)*(n/d)*(m/d)
  • 但这样每个询问复杂度是O(n)
  • 观察式子,发现[n/d] 最多有2sqrt(n) 个取值(整除....一段相同 参考链接)
  • 那么 (n/d)*(m/d)就至多有2sqrt(n)+2sqrt(m)个取值 (当然不是乘起来,因为对于一个n只有一个值而不是2sqrt(n)个)
  • 计算每个询问时枚举这2sqrt(n)+2sqrt(m)个取值,因为一个取值是一段,要乘一段miu的和,所以对莫比乌斯函数维护一个前缀和,就可以在sqrt(n)时间内出解

 

【WT1(WT是从小新那里学来的....发现竟然是问题的首字母):】

f(k)=Σ{k|d} miu(d/k)*(n/d)*(m/d)这个式子怎么计算?

d是k的倍数,取值k,2*k,3*k,...,t*k

f(k)=Σ{i=1..n/k} miu(i)*(n/(k*i))*(m/(k*i))   //注意,整除满足 x/a/b=a/(a*b)】

 

更一般的:

f(k)=Σ{k|d} miu(d/k)*F(d)

--> f(k)=Σ{i=1..n/k}miu(i)*F(i*k)

 【WT2 】如何按照整除取值相同分段?

当前除法为n/i,与它相同的上界到n/(n/i)

为什么?我想了好久,最后的方法是

考虑n是一段区间,n=p*i+q,被分成p段长为i的

i每增加1 q就减少p,(这时候整除的取值没有改变),最多能减少q/p个,那么此时i=i+q/p=(i*p+q)/p=n/(n/i)

 

注意:miu的区间和*(n/i)*(m/i)可能会溢出,对拍都没有发现.......

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=5e4+5;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){
     if(c=='-')f=-1; c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
    return x*f;
}
int n,a,b,c,d,k;
bool notp[N];
ll p[N],mu[N];
void sieve(){
    mu[1]=1;
    for(int i=2;i<=N-1;i++){
        if(!notp[i]) p[++p[0]]=i,mu[i]=-1;
        for(int j=1;j<=p[0]&&i*p[j]<=N-1;j++){
            int t=i*p[j];
            notp[t]=1;
            if(i%p[j]==0){
                mu[t]=0;
                break;
            }
            mu[t]=-mu[i];
        }
    }
    for(int i=1;i<=N-1;i++) mu[i]+=mu[i-1];
}
ll cal(int n,int m,int k){
    n/=k;m/=k;
    if(n>m) swap(n,m);
    ll ans=0;int r=0;
    for(int i=1;i<=n;i=r+1){
        r=min(n/(n/i),m/(m/i));
        ans+=(mu[r]-mu[i-1])*(n/i)*(m/i);
    }
    return ans;
}
int main(int argc, const char * argv[]) {
    //freopen("in.txt","r",stdin);
    //freopen("1.out","w",stdout);
    sieve();
    int T=read();
    while(T--){
        a=read();b=read();c=read();d=read();k=read();
        printf("%lld\n",cal(b,d,k)-cal(a-1,d,k)-cal(b,c-1,k)+cal(a-1,c-1,k));
    }
    
    return 0;
}

 

附:还有另一种思考的角度,从莫比乌斯函数的角度考虑,殊途同归

复制鏼爷的题解

推导:




用莫比乌斯函数的性质把求和的式子换掉,

其中,更换求和指标,

容易知道单调不上升,且最多有种不同的取值。所以按取值分成个段分别处理,一个连续段内的和可以用预处理出的莫比乌斯函数前缀和求出

转载于:https://www.cnblogs.com/candy99/p/6209502.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30911451/article/details/97985375

智能推荐

OpenCV 霍夫变换直线检测(SHT、MSHT和PPHT)_不断进取前进的博客-程序员秘密

一、霍夫变换简述   霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。霍夫变换是在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。   霍夫变换是于1962年由PaulH

关于zookeeper连接问题:“telnet ip:2181不能打开到主机的连接, 在端口 23: 连接失败”问题_zookeeper 2181 连接不上_以神之谕的博客-程序员秘密

关于“telnet ip:2181不能打开到主机的连接, 在端口 23: 连接失败”问题在学习zookeeper中,通过api的方式创建连接时,一直报超时,于是就使用:telnet ip:2181 这个命令看是不是端口的问题。结果我的天,太扎心了:此处红牌警告:“telnet ip 端口号”这个命令ip和端口号之间没有冒号(:)、没有冒号(:)、没有冒号(:)!!!!!另外多提一句:zookeeper连接超时的解决办法:1.先临时关闭linux上的防火墙,再使用“telnet ip ..

yaffs2移植到linux-4.3.2_linux 4.2 移植yaffs2_elecfan2011的博客-程序员秘密

1. 简介任务:将yaffs2移植到可在目标板上运行的linux-4.3.2 目标板: MINI24402. 准备工作下载yaffs2源码, https://yaffs.net/get-yaffs3. 移植工作3.1 解压yaffs2源码$ tar -xzf yaffs2-b6a3ae5.tar.gz 3.2 打补丁参考yaffs2文件夹下的README-linux$ cd yaffs-dir$

数据结构-单链表的实现_数据结构单列表_IT菜鸟闯天下的博客-程序员秘密

1.数据结构中,单链表也是很重要的一部分,单链表,顾名思义,就是像链子一样连接在一起的表。但是链表不一定都是连续存储的,它是通过一组地址任意存储单元存放线性表的数据元素,把存储单元称作一个节点。2.(类别)链表可以分为单链表,双链表还有双向循环链表,这三种链表的实现特征是相同的,但是中间还是有一些不同,今天我就把我所学到的单链表的知识分享给大家。3.(与顺序表的区别)单链表不同于顺序表的地

解決Ubuntu16.04搜狗输入法失效的问题_积微成著的博客-程序员秘密

问题:Ubuntu16.04系统安装的搜狗输入法能正常启动,也可以显示搜狗输入法图标和界面,但无法输入中文。重启后问题依然存在。解决方法:删除搜狗拼音输入法的配置文件,并重启输入法。执行如下命令:cd ~/.config #进入存放配置文件的位置find . -name sogou* #删除搜索到的配置文件sogou-qimpanelfind . -name Sogou* #删除搜索到的

Clean Code 读书笔记一——什么是 clean code?_昨日不可追的博客-程序员秘密

什么是 clean code ?大神对优雅代码的定义: I like my code to be elegant and efficient. Thelogic should be straightforward to make it hardfor bugs to hide, the dependencies minimal toease maintenance, error han

随便推点

python运维自动化脚本案例-python自动化运维脚本范例_weixin_39786850的博客-程序员秘密

1.列举当前目录以及所有子目录下的文件,并打印出绝对路径#!/usr/bin/python# coding=utf8import osimport sys if len(sys.argv) < 2: filepath=&quot;.&quot;else: filepath=sys.argv[1]for root,dirs,files in os.walk(filepath): for fi...

数值分析——求积公式_数值求积公式_XXX_UUU_XXX的博客-程序员秘密

对定积分中的被积函数f(x)用简单的函数近似替代。

Stack Overflow 2021开发者调查报告 - 数据库篇!_数据和云的博客-程序员秘密

点击上方&#34;蓝字&#34;关注我们,享更多干货!Stack Overflow 在今年 5-6 月进行了面向开发者的年度调查。近日,调查的报告结果正式公布。这份调查报告涉及到了许多方面...

使用wxString实现字符串在一个文件里面的替换_wxstring replace_A_XCODE_TEACHER的博客-程序员秘密

使用wxString实现字符串在一个文件里面的替换 wxFFile filehandler; wxString FileName = filename; wxString Content = ""; if(wxFileExists(FileName)) { filehandler.Open(FileName); filehandler.ReadAll(&Conte

SpringBoot 超大文件上传解决方案:分片断点上传(一)_大文件切块 前后端 springboot_M_Snow的博客-程序员秘密

一、 功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同。支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死...

推荐文章

热门文章

相关标签