【BZOJ2301】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,1≤c≤d≤50000,1≤k≤50000
思路:第一题反演……
利用容斥原理将原询问拆成4个,问题就转化为:
1<=i<=trunc(a div k),1<=j<=trunc(b div k),gcd(i,j)=1的(i,j)数对个数
令f(i)表示满足gcd(x,y)=i时(x,y)的对数,F(i)表示满足i|gcd(x,y)的(x,y)的对数
显然F(i)=trunc(n div i)*trunc(m div i)

f(1)=sigma u(d)*n div d*m div d (1<=d<=n)
观察可得n div d*m div d只有2根号n个取值,且每个取值对应的u(i)是连续的一段
然后就可以记录u的前缀和来优化
From http://m.blog.csdn.net/article/details?id=50590197

//uses sysutils;
const max=;
var mu,sum,prime:array[..max]of longint;
flag:array[..max]of longint;
a,b,c,d,k,i,j,t,m,cas,v:longint;
tmp:double; procedure swap(var x,y:longint);
var t:int64;
begin
t:=x; x:=y; y:=t;
end; function clac(n,m:longint):int64;
var i,t1,t2,pos:longint;
x,y:int64;
begin
if n>m then swap(n,m);
clac:=; i:=;
while i<=n do
begin
x:=n div i; y:=m div i;
t1:=n div x;
t2:=m div y;
if t1<t2 then pos:=t1
else pos:=t2;
clac:=clac+x*y*(sum[pos]-sum[i-]);
i:=pos+;
end;
end; begin
assign(input,'bzoj2301.in'); reset(input);
assign(output,'bzoj2301.out'); rewrite(output);
// tmp:=now;
read(cas);
mu[]:=;
for i:= to max do
begin
if flag[i]= then
begin
inc(m); prime[m]:=i;
mu[i]:=-;
end;
j:=;
while (j<=m)and(prime[j]*i<=max) do
begin
t:=prime[j]*i;
flag[t]:=;
if i mod prime[j]= then
begin
mu[t]:=;
break;
end;
mu[t]:=-mu[i];
inc(j);
end;
end;
for i:= to max do sum[i]:=sum[i-]+mu[i];
for v:= to cas do
begin
read(a,b,c,d,k);
dec(a); dec(c);
a:=a div k; b:=b div k; c:=c div k; d:=d div k;
writeln(clac(b,d)-clac(b,c)-clac(a,d)+clac(a,c));
end;
//writeln((now-tmp)*::);
close(input);
close(output);
end.
UPD(2018.10.22):C++
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 51000
#define M 410000
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 int mu[N+],s[N+],prime[N+],flag[N+]; ll calc(int n,int m)
{
if(n>m) swap(n,m);
ll ans=;
int i=;
while(i<=n)
{
ll x=n/i;
ll y=m/i;
int t1=n/x;
int t2=m/y;
int pos=min(t1,t2);
ans+=x*y*(s[pos]-s[i-]);
i=pos+;
}
return ans;
} int main()
{
int cas;
scanf("%d",&cas);
mu[]=;
int m=;
for(int i=;i<=N;i++)
{
if(!flag[i])
{
prime[++m]=i;
mu[i]=-;
}
for(int j=;j<=m;j++)
{
int t=prime[j]*i;
if(t>N) break;
flag[t]=;
if(i%prime[j]==)
{
mu[t]=;
break;
}
mu[t]=-mu[i];
}
}
for(int i=;i<=N;i++) s[i]=s[i-]+mu[i];
while(cas--)
{
int a,b,c,d,k;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
a--; c--;
a/=k; b/=k; c/=k; d/=k;
ll ans=calc(b,d)-calc(b,c)-calc(a,d)+calc(a,c);
printf("%lld\n",ans);
}
return ;
}
【BZOJ2301】Problem b(莫比乌斯反演)的更多相关文章
- [HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]
题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? ...
- [bzoj2301]Problem b莫比乌斯反演+分块优化
题意: $\sum\limits_{\begin{array}{*{20}{c}}{a < = x < = b}\\{c < = y < = d}\end{array}} {\ ...
- [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[ ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- [BZOJ1101&BZOJ2301][POI2007]Zap [HAOI2011]Problem b|莫比乌斯反演
对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. 我们可以令F[n]=使得n|(x,y)的数对(x,y)个数 这个很容易得到,只需要让x, ...
- BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...
- 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的, ...
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...
- Problem b 莫比乌斯反演+枚举除法的取值
莫比乌斯反演+枚举除法的取值 第二种形式: f(n)表示gcd(x,y)=n的数量. F(n)表示gcd(x,y)是n的倍数的数量. /** 题目:Problem b 链接:https://vjudg ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
随机推荐
- ASP.NET MVC+Bootstrap个人博客之praise.js点赞特效插件(二)
1. 为啥要做这个点赞插件? praise.js是一款小巧的jQuery点赞插件,使用简便,效果美观. 在做个人博客时遇到了文章点赞问题.联想到各大社交网络中的点赞特效:手势放大.红心放大等等, ...
- 13 Red-black Trees
13 Red-black Trees Red-black trees are one of many search-tree schemes that are "balanced" ...
- axis2与eclipse的整合:开始一个简单的axis2 的demo
1.下载axis2,现在axis2最新版本是axis2-1.6.2,下载地址:http://axis.apache.org/axis2/java/core/download.cgi 2.下载好的zip ...
- RegisterClientScriptBlock和RegisterStartupScript的区别
RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚 ...
- js面向对象之构造函数
最简单的面向对象程序<script type="text/javascript"> var obj = new Object(); obj.qq = '10791611 ...
- close - 关闭一个文件描述符
SYNOPSIS 总览 #include <unistd.h> int close(int fd); DESCRIPTION 描述 close 关闭 一个 文件 描述符 , 使它 不在 指 ...
- java中属性命名get字母大小写问题
java文件 company.java private int sTime; public void setSTime (int sTime) { this.sTime = sTime; ...
- Maven的pom报错的解决方法
如果在MyEclipse里面导入项目,导入不了,如下图 接下来可以点击Import Maven Projects里的Action那一行Resolve Later. 点击Do Not Execute(a ...
- Solaris 默认Shell 修改
ssh登陆远程的solaris 10,backspace出现乱码. ssh登陆远程的solaris 10默认Shell不是bash 把solaris10的shell环境改为bash就行 dev13% ...
- hdfs深入:02、今日课程内容大纲以及hdfs的基本实现
1.hadoop第三天课程内容 hdfs:分布式文件存储系统hdfs的架构图hdfs的副本机制以及block块hdfs的元数据信息fsimage与editshdfs的文件读写过程hdfs的javaAP ...