题意:

$\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. programming review (c++): (1)vector, linked list, stack, queue, map, string, bit manipulation

    编程题常用知识点的review. most important: 想好(1)详尽步骤(2)边界特例,再开始写代码. I.vector #include <iostream> //0.头文件 ...

  2. python 基础1.1--windows/linux 下安装python

    一.windows下安装python 1>windows上python后缀是.msi的,下载下来后,直接双击运行.会在c盘生成python.exe的文件,把python.exe的文件加入到win ...

  3. 一种流量成本节省60%以上的手机直播微信直播H5直播幼儿园直播方案

    前言 近几年视频直播可以说是非常火热,EasyDarwin也非常受开发者的欢迎,不仅仅是主播火了,而且各种商业直播也火了起来:会场直播.宴会直播.讲座直播.景区直播.后厨直播.课堂直播.幼儿园直播等等 ...

  4. 九度OJ 1005:Graduate Admission (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5646 解决:1632 题目描述: It is said that in 2011, there are about 100 graduat ...

  5. mybatis 各组件生命周期

    1.SqlSessionFactoryBuilder SqlSessionFactoryBuilder是通过利用XML或者java编码来获取Configuration配置来构建SqlSessionFa ...

  6. python 创建一个实例:步骤一 编写一个构造函数

    编写一个构造函数 #在python中,person 类的第一件是就是记录关于人员的基本信息,这叫做实例对象属性,并且它们通常通过给类方法函数中的self 属性赋值来创建. #赋给实力属性第一个值得通常 ...

  7. Linux入门基础(三)——系统命令

  8. ListView多选和单选模式重新整理

    超简单的单选和多选ListView 在开发过程中,我们经常会使用ListView去呈现列表数据,比如商品列表,通话记录,联系人列表等等,在一些情况下,我们还需要去选择其中的一些列表数据进行编辑.以前, ...

  9. http://blog.csdn.net/renfufei/article/details/37725057/

    版权声明:本文为博主原创文章,未经博主允许不得转载. 原创:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 ...

  10. SQL语句编写注意问题

    下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍.在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描 ...