题目大意:

一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于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 莫比乌斯反演+离线查询+树状数组的更多相关文章

  1. BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)

    1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...

  2. ACdream 1127 Base Station (离线查询+树状数组)

    题目链接: http://acdream.info/problem?pid=1127 题目: 移动通信系统中,通信网的建立主要通过基站来完成. 基站可以分为主基站和子基站.子基站和各个移动用户进行连接 ...

  3. hdu 5869 区间不同GCD个数(树状数组)

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  4. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  5. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组

    题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...

  6. hdu 6203 ping ping ping(LCA+树状数组)

    hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...

  7. bzoj3529(莫比乌斯反演+离线+树状数组)

    在你以为理解mobus的时候,苦苦想通过化简公式来降低复杂度时,这题又打了我一巴掌. 看来我并没有理解到acmicpc比赛的宗旨啊. 这么多次查询可以考虑离线操作,使用树状数组单点更新. /***** ...

  8. HDU 4630 No Pain No Game 树状数组+离线查询

    思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algo ...

  9. HDU 5869 Different GCD Subarray Query 树状数组+离线

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

随机推荐

  1. ECMAScript 6教程 (二) 对象和函数

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文连接,博客地址为 http://www.cnblogs.com/jasonnode/ .该系列课程是 ...

  2. jquery file upload 文件上传插件

    1. jquery file upload 下载 jquery file upload Demo 地址:https://blueimp.github.io/jQuery-File-Upload/ jq ...

  3. php之XML转数组函数的方法

    <?/** * xml2array() will convert the given XML text to an array in the XML structure. * Link: htt ...

  4. 用CSS3实现文字描边

    CSS3作为新兴的前端技术可以实现很多复杂变化的效果,比如文字描边. 这里主要用到text-shadow属性,顾名思义就是为文字加上阴影效果.例: text-shadow:10px 5px 2px # ...

  5. js页面刷新之实现框架内外刷新(整体、局部)

    这次总结的是框架刷新: 框架内外的按钮均可以定义网页重定向, 框架内部页面的按钮可以实现局部刷新, 框架外部页面的按钮可以实现整页刷新. 代码如下(两个html页面): <!--主界面index ...

  6. 有向图的强连通图——Kosaraju

    有向图的强连通分量: 相互可达关系,每一个集合都是有向图的一个强连通分量SCC. 把一个集合看成一个点,SCC就形成了一个有向无环图——DAG;       如果DFS选择不好,从A点开始DFS,就会 ...

  7. Intent意图

    1.显式Intent button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(Vie ...

  8. Java动态代理的两种实现方式:

    方式一:传统的代理 package cn.hc.domain; import java.lang.reflect.InvocationHandler; import java.lang.reflect ...

  9. Populating Tree Item With Record Group In Oracle Forms

    The below plsql program unit could be used in a WHEN-NEW-FORM-INSTANCE trigger to initially populate ...

  10. Python进阶之“属性(property)”详解

    Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将类方法转换为只读属性 重新实现一个属性的setter和getter ...