【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, ...
随机推荐
- A8通用权限框架
- ReactJS-2-props vs state
rops理解: 大多数组件都可以在创建的时候被不同的参数定制化,这些不同的参数就叫做props.props的流向是父组件到子组件. 子组件Comment,是一条评论组件,父组件CommentList, ...
- vue报错-Error: Cannot find module '@babel/core'
vue之webpack实战的时候遇到报错,Error: Cannot find module '@babel/core' 这报错,我百度了很久,后来发现报错里面有提示,发现是我的 babel-load ...
- 30款jQuery常用网页焦点图banner图片切换
1.jquery 图片滚动特效制作 slide 图片类似窗帘式图片滚动 查看演示 2.jquery幻灯片插件带滚动条的圆形立体图片旋转滚动 查看演示 3.jQuery图片层叠旋转类似洗牌翻转图片幻灯片 ...
- R in action读书笔记(17)第十二章 重抽样与自助法
12.4 置换检验点评 除coin和lmPerm包外,R还提供了其他可做置换检验的包.perm包能实现coin包中的部分功能,因此可作为coin包所得结果的验证.corrperm包提供了有重复测量的相 ...
- .net mvc 运行监控和错误捕捉
方法类 /// <summary> /// 运行监控类 /// </summary> [AttributeUsage(AttributeTargets.Class | Attr ...
- vue2.0 组件化
简单理解其实组件就是制作自定义的标签,这些标签在HTML中是没有的. 组件注册的是一个标签,而指令注册的是已有标签里的一个属性.在实际开发中我们还是用组件比较多,指令用的比较少. <!DOCTY ...
- 迅为I.MX6开发板工业级嵌入式开发平台
迅为-i.MX6开发板是是基于ARM Cortex™-A9架构的高扩展性多核系列应用处理器, i.MX6系列芯片而且根据应用场合的不同,提供了可供选择的单核.双核和四核产品供客户选择.i.MX6系列的 ...
- 迅为电子HMI人机界面|CAN总线触摸屏
本文转自迅为:http://www.topeet.com 协议特色: 1. 支持所有 CAN 协议,例如常用的 J1939 和 CANopen 协议. 2. 提供高度开放的 CAN 帧的编辑界面,用户 ...
- swift try try? try!
try You have 2 options when you try calling a function that may throw. You can take responsibility o ...