hdu4746:2013杭州网络赛I 莫比乌斯反演
题意:
有5000组询问,每组询问求有多少i,j满足i∈[1,n],j∈[1,m]且gcd(i,j)的质因子数目<=p。 n,m<=500000
思路:
首先预处理出每个数的质因子数目分别等于多少,则问题转化为求给定区间内,gcd等于某一堆数的i,j有多少组
发现很像一个基础莫比乌斯反演题:hdu1695。但是此题在某组询问中可能要处理很多个gcd,所以需要进行一些预处理
我们首先筛出每个数的莫比乌斯函数和它的质因子个数
通过容斥的公式可以看出如果要求的gcd为d,那么d*i的倍数对答案的贡献为 mobi[i]。
这样就可以预处理出每个p对应位置的莫比乌斯函数系数之和p[19][500000]
注意这里容易想到p是小于等于18的,因为50W之内的数最多有18个质因子(2^19>500000)
然后对p数组求前缀和,可以使单组查询复杂度变为p*sqrt(n),具体为什么是分块sqrt(n)可以参考hdu1695的题解。交了一发超时了。。
还以为写搓了,后来发现可以再求一次前缀和。。这样单组查询变成了sqrt(n),终于过了
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=;
int mb[maxn+];
int notprime[maxn+];
int num[maxn+];
int prime[maxn];
vector<int>v[];
int np=;
void setprime()
{
memset(notprime,,sizeof(notprime));
mb[]=;
num[]=;
for(int i=; i<=maxn; i++)
{
if(!notprime[i])
{
prime[np++]=i;
num[i]=;
mb[i]=-;
}
for(int j=; j<np&&i*prime[j]<=maxn; j++)
{
notprime[i*prime[j]]=;
num[i*prime[j]]=num[i]+;
//v[num[i]+1].push_back(i*prime[j]);
if(i%prime[j]==)
{
mb[i*prime[j]]=;
break;
}
else
{
mb[i*prime[j]]=-mb[i];
}
}
}
}
int p[][];
int sum[][];
int f[][];
int main()
{
freopen("in.txt","r",stdin);
setprime();
for(int i=; i<=maxn; i++)
{
for(int j=; i*j<=maxn; j++)
{
p[num[i]][i*j]+=mb[j];
}
}
for(int i=; i<=; i++)
{
sum[i][]=;
for(int j=; j<=maxn; j++)
{
sum[i][j]=sum[i][j-]+p[i][j];
}
}
for(int i=; i<=maxn; i++)
{
f[][i]=sum[][i];
for(int j=;j<=;j++)
{
f[j][i]=f[j-][i]+sum[j][i];
}
}
int n,m,k,q;
scanf("%d",&q);
while(q--)
{
long long ans=;
scanf("%d%d%d",&n,&m,&k);
if(k>)
{
printf("%I64d\n",(long long)n*m);
continue;
}
if(n>m)
swap(n,m);
for(int j=; j<=n; j++)
{
int to=min(n/(n/j),m/(m/j));
ans+=(long long)(n/j)*(m/j)*(f[k][to]-f[k][j-]);
j=to;
}
printf("%I64d\n",ans);
}
return ;
}
hdu4746:2013杭州网络赛I 莫比乌斯反演的更多相关文章
- HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)
Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- HDU 4747 Mex (2013杭州网络赛1010题,线段树)
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)
Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2013杭州网络赛D题HDU 4741(计算几何 解三元一次方程组)
Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 2013杭州网络赛C题HDU 4640(模拟)
The Donkey of Gui Zhou Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu 4738 Caocao's Bridges(2013杭州网络赛丶神坑)
就是求最小权值的桥..不过有好几个坑... 1:原图不连通,ans=0. 2: m<=n^2 显然有重边,重边必然不是桥,处理重边直接add(u, v, INF). 3: 最小桥边权为0的时 ...
- hdu 4741 Save Labman No.004(2013杭州网络赛)
http://blog.sina.com.cn/s/blog_a401a1ea0101ij9z.html 空间两直线上最近点对. 这个博客上给出了很好的点法式公式了...其实没有那么多的tricky. ...
随机推荐
- Linux Terminal 控制终端的使用
1. Open new Terminal:Ctrl + Alt + T 或者 Ctrl + Shift + N 2. Open Tab:Ctrl + Shift + T 3. Close Tab:Ct ...
- Codeforces 526D - Om Nom and Necklace 【KMP】
ZeptoLab Code Rush 2015 D. Om Nom and Necklace [题意] 给出一个字符串s,判断其各个前缀是否是 ABABA…ABA的形式(A和B都可以为空,且A有Q+1 ...
- verilog之task用法实例
该用法的代码源自夏宇闻老师的教材. 源代码: module traffic_lights; reg clock, red, amber, green; , off = , red_tics = , a ...
- Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)
Python 面向对象(初级篇) 51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...
- Linq101-Element
using System; using System.Collections.Generic; using System.Linq; namespace Linq101 { class Element ...
- 关于图表的JS插件
http://echarts.baidu.com/ http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6% ...
- Excel操作 Microsoft.Office.Interop.Excel.dll的使用
----转载: http://www.cnblogs.com/lanjun/archive/2012/06/17/2552920.html 先说说题外话,前段时间近一个月,我一直在做单据导入功能,其中 ...
- Asp.net 菜单控件
本文介绍的菜单控件采用的css 和ul list来显示菜单,生成的html小,无需javascript支持,对大部分的浏览器都支持,除ie6要单独修改css也可以使其支持. 通过本文可以了解asp.n ...
- 微信小应用vs progressive-web-apps
https://developers.google.com/web/progressive-web-apps/
- SQL Database学习笔记
1. linux下快速安装MariaDB: MariaDB 是 一个采用 Maria 存储引擎的 MySQL 分支版本,是由原来 MySQL 的作者 Michael Widenius 创办的公司所 ...