题目大意:

一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于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. 【转】PowerShell入门(五):Cmd命令与PowerShell命令的交互

    转至:http://www.cnblogs.com/ceachy/archive/2013/02/18/Call_Between_Cmd_And_PowerShell.html 单独使用一种脚本来完成 ...

  2. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制

    第一部分 基本设计 目前最新版本的C#驱动MongoDB-CSharpDriver-2.2.3,比之前的版本更新比较大,在网上很难找到这个版本的相关C#操作资料,以下都是个人自发研究.测试的,如有雷同 ...

  3. Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

    1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  4. UICollectionViewDelegateFlowLayout 使用

    import UIKit //UICollectionViewLayout //itemSize属性 //设定全局的Cell尺寸,如果想要单独定义某个Cell的尺寸,可以使用下面方法: // - (C ...

  5. [课程设计]Scrum 2.1 多鱼点餐系统开发进度(下单列表布局)

    [课程设计]Scrum 2.1 多鱼点餐系统开发进度(下单列表布局) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店 ...

  6. nginx简单的rewrite配置

    假设当前已存在location /test/,希望配置一个短连接/ts/与之相同,就需要用到rewrite 直接配置到server段 rewrite ^/ts/(.*) /test/$1; 或者放到l ...

  7. CyclicBarrier和CountDownLatch的差别

    CyclicBarrier和CountDownLatch都用多个线程之间的同步,共同点:同时有N个线程在 CyclicBarrier(CountDownLatch) 等待上等待时,CyclicBarr ...

  8. Rmarkdown用法与R语言动态报告

    Rmarkdown用法与R语言动态报告数据分析用R语言非常便捷,因为R语言的社区强大,并且在不断更新和完善,提供了各种分析利器.Knitr和Rmarkdown包则是数据分析中的动态报告利器. 下面是一 ...

  9. URL地址传参乱码

    1.页面使用javascript的方法encodeURIComponent对需要转码的字符进行两次转码,如:encodeURIComponent(encodeURIComponent("** ...

  10. php中的访问修饰符 private、protected、public的作用范围

    1. private 只能在类内部使用 2. protected 可以在类内部和继承类里使用.类外部不能使用[即实例化后的对象无法调用] 3. public 全部范围适用. 4.子类复写父类中的方法时 ...