题意:

$\sum\limits_{\begin{array}{*{20}{c}}
{a < = x < = b}\\
{c < = y < = d}
\end{array}} {\gcd (x,y) = = k} $

解题关键:

现令$f(i)$表示有多少对${(x,y)}$满足 ${\gcd (x,y) =  = d}$,$1 <  = x <  = n,1 <  = y <  = m$

$F(d)$为有多少对${(x,y)}$满足 ${\gcd (x,y) =  = d}$的倍数

$f(d) = \sum\limits_{\begin{array}{*{20}{c}}
{1 < = x < = n}\\
{1 < = y < = m}
\end{array}} {\gcd (x,y) = = d} $

$\begin{array}{l}
F(d) = \frac{n}{d} * \frac{m}{d}\\
\begin{array}{*{20}{l}}
{F(d) = \sum\limits_{d|x} {f(x)} \Rightarrow }\\
{f(d) = \sum\limits_{d|x} {u(\frac{x}{d})F(x)} = \sum\limits_{d|x} {u(\frac{x}{d})\left\lfloor {\frac{n}{x}} \right\rfloor } \left\lfloor {\frac{m}{x}} \right\rfloor }
\end{array}\\
= \sum\limits_{d|x}^{\min (n,m)} {u(\frac{x}{d})} \left\lfloor {\frac{n}{x}} \right\rfloor \left\lfloor {\frac{m}{x}} \right\rfloor
\end{array}$

再根据二维前缀和的型,$ans = g(b,d,k) + g(a - 1,c - 1,k) - g(a - 1,d,k) - g(b,c - 1,k)$

法二:稍微转化一下。

$\begin{array}{*{20}{l}}
{f(d) = {\sum _{\begin{array}{*{20}{c}}
{1 < = x < = n}\\
{1 < = y < = m}
\end{array}}}\gcd (x,y) = = d}\\
{ = {\sum _{\begin{array}{*{20}{c}}
{1 < = x < = n}\\
{1 < = y < = m}
\end{array}}}\gcd (\frac{x}{d},\frac{y}{d}) = = 1}\\
{\begin{array}{*{20}{l}}
{ = {\sum _{\begin{array}{*{20}{c}}
{1 < = x < = \frac{n}{d}}\\
{1 < = y < = \frac{m}{d}}
\end{array}}}\gcd (x,y) = = 1}\\
{ = \sum\limits_{i = 1}^{\min (\frac{n}{d},\frac{m}{d})} u (i)F(i)}
\end{array}}\\
{ = \sum\limits_{i = 1}^{\min (\frac{n}{d},\frac{m}{d})} u (i)\left\lfloor {\frac{n}{{di}}} \right\rfloor \left\lfloor {\frac{m}{{di}}} \right\rfloor }\\
{}
\end{array}$

预处理前缀和+分块,$n/i$这种类型的一般要考虑重复性,利用分块可以优化到根号的复杂度。

观察式子,会发现$\left\lfloor {\frac{n}{d}} \right\rfloor $最多有$2\sqrt n $个取值,同理,$\left\lfloor {\frac{m}{d}} \right\rfloor $最多有$2\sqrt m $个取值,枚举这$2(\sqrt n  + \sqrt m )$个取值,对莫比乌斯函数维护一个前缀和,可以在$O(\sqrt n )$内求出解。

n/(n/i)就是满足商为n/i的i的最大值

复杂度的详细证明:http://blog.csdn.net/outer_form/article/details/50590197

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//莫比乌斯函数线性筛法
const int maxn=+;
bool vis[maxn];
int prime[maxn],mu[maxn],sum1[maxn];
void init_mu(int n){
int cnt=;
mu[]=;
for(int i=;i<n;i++){
if(!vis[i]){
prime[cnt++]=i;
mu[i]=-;
}
for(int j=;j<cnt&&i*prime[j]<n;j++){
vis[i*prime[j]]=;
if(i%prime[j]==) {mu[i*prime[j]]=;break;}
else { mu[i*prime[j]]=-mu[i];}
}
}
for(int i=;i<n;i++){
sum1[i]=sum1[i-]+mu[i];
}
}
inline int read(){
char k=;char ls;ls=getchar();for(;ls<''||ls>'';k=ls,ls=getchar());
int x=;for(;ls>=''&&ls<='';ls=getchar())x=(x<<)+(x<<)+ls-'';
if(k=='-')x=-x;return x;
}
int fun(int n,int m,int k){
n/=k,m/=k;
if(n>m) swap(n,m);
int ans=,pos;
for(int i=;i<=n;i=pos+){
pos=min(n/(n/i),m/(m/i));
ans+=(sum1[pos]-sum1[i-])*(n/i)*(m/i);
}
return ans;
}
int main(){
int t,a,b,c,d,k;
init_mu();
t=read();
while(t--){
a=read(),b=read(),c=read(),d=read(),k=read();
int t1=fun(b,d,k),t2=fun(a-,c-,k),t3=fun(a-,d,k),t4=fun(b,c-,k);
int ans=t1+t2-t3-t4;
printf("%d\n",ans);
}
}

  

[bzoj2301]Problem b莫比乌斯反演+分块优化的更多相关文章

  1. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

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

  2. [HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]

    题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? ...

  3. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满 ...

  4. bzoj 2301 [HAOI2011]Problem b(莫比乌斯反演+分块优化)

    题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 1≤n≤50000,1≤a≤b≤50000, ...

  5. [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)

    [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...

  6. bzoj2301 [HAOI2011]Problem b【莫比乌斯反演 分块】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 很好的一道题.首先把每个询问转化为4个子询问,最后的结果就是这四个子询问的记过加加减减 ...

  7. BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块

    问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...

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

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

  9. BZOJ2301: [HAOI2011]Problem b 莫比乌斯反演

    分析:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 然后对于求这样单个的gcd(x,y)=k的, ...

随机推荐

  1. Android-理解window和windowmanager

    1.window和windowmanager的关系 window是一个抽象类,具体实现为phoneWindow.创建一个window可以通过windowmanager来实现. window的具体实现在 ...

  2. Linq Group By 多个字段

    var counts = dal.QueryStatisticsCount(condition); var result = from p in counts group p by new { Auc ...

  3. 开发过程中,本地分支和远程跟踪分支发生了diverge

    1 git基本概念梳理 1.1 git的工作目录.暂存区和HEAD指向的版本库以及branch的概念 一个branch就是整个产品的一套代码,而工作目录中就是存放的本branch最新的代码,HEAD指 ...

  4. vs2013工程下的各个文件和文件夹的作用

    1 ipch文件夹 用来加速编译,里面存放的是precompiled headers,即预编译好了的头文件. 头文件也是需要编译的,比如需要处理#ifdef,需要替换宏以及需要include其它头文件 ...

  5. ddchuxing——php面试题及答案

    1.  echo和print的区别 echo没有返回值,print有返回值1,执行失败时返回false:echo输出的速度比print快,因为没有返回值:echo可以输出一个或多个字符串,print只 ...

  6. Ceph集群rbd-mirror A、B区域备份实施方案

    Ceph集群rbd-mirror A.B区域备份实施方案 备注:首先准备两个集群, 并确认其状态,集群的准备过程在这就不做陈述 1.查看集群状态 A区域 [root@ceph2111 ceph]# c ...

  7. 使用maven3 创建自定义的archetype

    创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...

  8. Spring项目中使用jackson序列化key为对象Map

    1.注入ObjectMapper2.注册类HistoricTaskInstance的序列化和反序列化类HistoricTaskInstanceKeySerializer,HistoricTaskIns ...

  9. java基础之容器、集合、集合常用方法

    一.容器(Collection):数组是一种容器,集合也是一种容器 java编程中,装其他各种各样的对象(引用类型)的一种东西,叫容器 注意: 1.数组的长度是固定的 2.集合:长度不固定, 可以随时 ...

  10. 利用framebuffer,命令行显示图片

    上代码 import fcntl import struct import mmap import contextlib import os import time import numpy as n ...