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 ...
随机推荐
- Entity Framework && Lambda
Lambda表达式详细总结 C# 代码了解委托.匿名方法.Lambda 表达式和闭包本质 将使用了C# Lambda表达式的程序集反编译后,我们发现,它实际上和匿名方法没有什么不同.Lambda的输入 ...
- js 获取参数
<html lang="en"> <head> <meta charset="UTF-8"> <meta name=& ...
- javascript,jQuery,trim()
JavaScript trim() Syntax string.trim() The trim() method removes whitespace from both sides of a str ...
- linux bash快捷键
bash快捷键 CTRL+F 光标向前移动一个字母 CTRL+B 光标向后移动一个字母 CTRL+A HOME CTRL+E END
- 初识python第一天
一.python简介 1.1 python的诞生 python的创始人吉多.范罗苏姆(Guido van Rossum),他在开发python语言之前曾使用过几年的ABC语言,ABC是一门主要用于教学 ...
- zigbee学习之路(九):串口(发送)
一.前言 今天,我们来学习和实验串口模块方面的,串口通信是我们常用的通信手段,通过串口交互,我们可以很容易的和pc机进行数据的交换和发送,所以我们今天就来学习一下.这个实验所进行的功能是一开始CC25 ...
- Linux phpbb论坛的安装(中文版)
1:建立文件夹
- Unity在编辑器状态下清空控制台信息
public static void ClearConsole() { var assembly = System.Reflection.Assembly.GetAssembly(typeof(Uni ...
- -webkit-transform:scale(1.04)放大缩小效果
<p>[鼠标移动进去图片放大一倍效果:运用了-webkit-transform:scale(1.04)效果]</p> 如图:鼠标移动上去的时候图片放大一倍的效果, <!D ...
- Jquery 复习练习(02)Javascript 与jquery 互转 onclick 与click区别
Javascript 与jquery 互转 jquery 为<script src="jquery-1.8.3.js"></script> 以checkbo ...