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. ...
随机推荐
- iOS国际化支持
写给自己看: 1.先创建一个国际化文件,用于描述在不同的区域环境,显示不同的value.文件名必须是Localizable.strings,文件的内容稍后再写.
- group by、order by 先后顺序问题
今天遇到个小问题 本来是很基础的问题 应该说 基础知道掌握的不牢 好了不说 错误 语句 : select a.a1 from table a where order by a.a1 gro ...
- HDU5327
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int ...
- ASP.NET 实现上一篇文章 下一篇文章
select top 1 * from job_hrnews where newsid>162 --下一篇 select top 1 * from job_hrnews where newsi ...
- Android Service生命周期及用法
Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行, ...
- C# 汉字的字符串截取指定字节的长度
int index = 0; int setCharCount = 74; string str1 = "三星 SCH-I829 电信3G手机(优 ...
- JavaScript—window对象使用
window对象是JavaScript浏览器对象模型中的顶层对象,包含多个常用方法和属性: 1. 打开新窗口 window.open(pageURL,name,parameters) 其中:pageU ...
- 解决 SQLSERVER 2008 无法删除作业
SQLSERVER 2008 中删除作业时遇到无法删除 解决办法: USE [msdb] ) SET @job_name = N'JobName' --注:jobName为维护计划对应的jobName ...
- Landsat元数据批量下载工具
目录 前言 landsat数据情况简介 下载元数据 总结 一.前言 最近由于工作需要,需要下载部分landsat数据的元数据,老板大手一挥,给了十几年的landsat的path.row以 ...
- model 和 view 实现思考
采用model.view = view 和 view.model=model 进行双向绑定,还有一种方案是采用id号进行绑定,viewmodel的views 和 models 属性存放所有的id 映 ...