HDU 4746 莫比乌斯反演+离线查询+树状数组
题目大意:
一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数
多次询问1<=x<=n,1<=y<=m,P , 找到多少对gcd(x,y)是P的幸运数
这里k定为k是P的幸运数
这跟之前做的http://www.cnblogs.com/CSU3901130321/p/4902748.html CSU1325的题目很像,但是这里求sum[]要复杂了很多
本来是枚举k,d求sum的,但是每次询问,P都在变,而我们需要得到的是一整串的k,假定G是P最大的幸运数,那么稍微想一下 就可以知道
k是在[1,G]的区间内的任何整数
那么我们将询问离线处理,按P小优先排序
那么一个个查询的时候,不断将k值更新前缀和,前缀和更新就很容易使用树状数组加速更新了,那么之后查询同样用树状数组就行了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define ll long long
#define M 500000
#define lowbit(x) x&(-x)
int mu[M+] , prime[M] , check[M+] , tot , cnt[M+];//cnt[i]记录i有多少个素因子
ll f[M+],ans[M+];
int q;
vector<int> vec[M+]; void init()
{
for(int i= ; i<=M ; i++) vec[cnt[i]].push_back(i);
} void get_mu()
{
mu[]= , cnt[]=;
for(int i= ; i<=M ; i++){
if(!check[i]){
mu[i]=-;
cnt[i]=;
prime[tot++] = i;
}
for(int j= ; j<tot ; j++){
if(prime[j]*i>M) break;
check[i*prime[j]] = ;
cnt[i*prime[j]] = cnt[i]+;
if(i%prime[j]==) break;
else mu[i*prime[j]] = -mu[i];
}
}
} struct Query{
int n , m , p , id;
void read(int i){
scanf("%d%d%d" , &n , &m , &p);
id=i;
if(n>m) swap(n,m);
}
bool operator<(const Query &m)const {
return p<m.p;
}
}qu[M]; void update(int x , int v)
{
for(int i=x ; i<=M ; i+=lowbit(i))
f[i] = f[i]+v;
} ll query(int x)
{
ll ans = ;
for(int i=x ; i> ; i-=lowbit(i)) ans = ans+f[i];
return ans;
} void add_mul(int x)
{
int len = vec[x].size();
for(int i= ; i<len ; i++){
int fac = vec[x][i];
for(int d= ; d*fac<=M ; d++){
update(d*fac , mu[d]);
}
}
} ll cal(int n , int m)
{
ll ans=;
for(int t= , last ; t<=n ; t=last+){
last = min(n/(n/t) , m/(m/t));
ans = ans+(ll)(query(last) - query(t-))*(n/t)*(m/t);
}
return ans;
} void solve()
{
int cur = ;
for(int i= ; i<=q ; i++){
while(cur<=qu[i].p) add_mul(cur++);
ans[qu[i].id] = cal(qu[i].n , qu[i].m);
}
for(int i= ; i<=q ; i++) cout<<ans[i]<<endl;
} int main()
{
// freopen("a.in" , "r" , stdin);
get_mu();
init();
scanf("%d" , &q);
for(int i= ; i<=q; i++) qu[i].read(i);
sort(qu+ , qu+q+);
solve();
return ;
}
HDU 4746 莫比乌斯反演+离线查询+树状数组的更多相关文章
- BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...
- ACdream 1127 Base Station (离线查询+树状数组)
题目链接: http://acdream.info/problem?pid=1127 题目: 移动通信系统中,通信网的建立主要通过基站来完成. 基站可以分为主基站和子基站.子基站和各个移动用户进行连接 ...
- hdu 5869 区间不同GCD个数(树状数组)
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组
题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...
- hdu 6203 ping ping ping(LCA+树状数组)
hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...
- bzoj3529(莫比乌斯反演+离线+树状数组)
在你以为理解mobus的时候,苦苦想通过化简公式来降低复杂度时,这题又打了我一巴掌. 看来我并没有理解到acmicpc比赛的宗旨啊. 这么多次查询可以考虑离线操作,使用树状数组单点更新. /***** ...
- HDU 4630 No Pain No Game 树状数组+离线查询
思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algo ...
- HDU 5869 Different GCD Subarray Query 树状数组+离线
Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...
随机推荐
- SharpZipLib 文件/文件夹压缩
一.ZipFile ZipFile类用于选择文件或文件夹进行压缩生成压缩包. 常用属性: 属性 说明 Count 文件数目(注意是在ComitUpdat之后才有) Password 压缩包密码 Siz ...
- Bitnami redmine备份升级步骤
从3.2.1升级至3.3.0,不确定数据库结构是否有变化,主要过程:先停止服务,安装redmine模块,恢复服务. 以下适用于windows操作系统,采用Bitnami安装方式: 1.完整备份 Fol ...
- Ubuntu16.04搭建LAMP架构服务器
安装Apache: weirubo@weirubo-VirtualBox:~$ sudo apt-get install apache2 查看Apache版本: weirubo@weirubo-Vi ...
- python : HTML+CSS (定时器轮寻)
定时器轮寻 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- java 中继承,组合,重载,重写的实现原理 (转)
我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...
- TCP/IP协议(二)
2014-09-04 11:03:27 注:关于seq 和 ack 的理解,seq为发送的字节的第一个序号,一直累加,ack接收字节的最后一个序号+1,建立连接和结束连接时的SYN.FIN标志位占 ...
- 【Python】我的Python学习笔记【2】【using Python 3】
... 1. 在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值, 所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便. 2. ...
- centos6.6编译安装lnmp系列之PHP
简介: 环境:虚拟机+centos6.6 在百度云盘里面我分享的安装软件包,包含LNMP系列软件. http://pan.baidu.com/s/1gdvnimv 1.安装前配置: 关闭selinux ...
- 关于F12的有效利用
1.之前仅用F12查看页面的代码: 2.现在发现用F12可以查看css文件: 3.比如看到页面背景为黑色,然后在css里面把背景从黑色调成白色:
- Ubuntu+Win7双系统grub的修复问题
最近,在grub引导的Ubuntu+Win7双系统上作业,用的是Ubuntu14.04.2.进行系统更新,更新到一般卡住了,恰好此时在进行grub相关文件的更新,我把机器重启后进入了grub resc ...