题意:

有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 莫比乌斯反演的更多相关文章

  1. HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  2. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. 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 ...

  4. 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 ...

  5. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 2013杭州网络赛D题HDU 4741(计算几何 解三元一次方程组)

    Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. 2013杭州网络赛C题HDU 4640(模拟)

    The Donkey of Gui Zhou Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. hdu 4738 Caocao's Bridges(2013杭州网络赛丶神坑)

    就是求最小权值的桥..不过有好几个坑... 1:原图不连通,ans=0. 2: m<=n^2 显然有重边,重边必然不是桥,处理重边直接add(u, v, INF). 3:   最小桥边权为0的时 ...

  9. hdu 4741 Save Labman No.004(2013杭州网络赛)

    http://blog.sina.com.cn/s/blog_a401a1ea0101ij9z.html 空间两直线上最近点对. 这个博客上给出了很好的点法式公式了...其实没有那么多的tricky. ...

随机推荐

  1. Linux后台开发面试问题汇总

    个人从事安全后台开发,当然是linux环境下的了.举几个常见的问题.1. 数据结构基础.比如实现一个最简单的哈希表.2. 操作系统基础.linux进程模型,堆/栈的区别,大概的位置,各往哪个方向生长, ...

  2. 樱花雨 www.yinghy.com

    自己刚申请的域名,和主机,以后就用这个来试着做点东西

  3. updatepanel的用法之triggers

    triggers有的两种触发器asyncpostbacktrigger和postbacktrigger.asyncpostbacktrigger(异步回调触发器):局部刷新,只刷新updatepane ...

  4. 【转】 iOS Provisioning Profile(Certificate)与Code Signing详解

    原文:http://blog.csdn.net/phunxm/article/details/42685597 引言 关于开发证书配置(Certificates & Identifiers & ...

  5. 键盘数字对应的ASCII码(keycode码)

    keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...

  6. 限制窗口拉伸范围——WM_GETMINMAXINFO

    注意:此方法对CListCtrl的Report模式下的表头绘制有影响,用时需注意测试! 使用OnSizing的改进版 该例程用处为将窗口限制了大小,并且只允许上下拉伸.需要注意的是WM_GETMINM ...

  7. hdu1301 Jungle Roads (Prim)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 依旧Prim............不多说了 #include<iostream> ...

  8. linux之umask函数解析

    [lingyun@localhost umask_1]$ vim umask.c  + umask.c                                                 ...

  9. Oracle 体系结构及安全管理

    1 oracle数据库服务器构成:数据库和实例2 oracle内部结构: 物理存储结构: 数据文件(xxx.dbf):存放数据 控制文件(xxx.ctl):控制数据库的完整性恢复数据或使用的日志文件 ...

  10. Python爬虫预备知识

    1.http编程知识 http中client 和server的工作模式 client和server建立可靠的tcp链接(在HTTP1.1中这个链接是长时间的,超时断开策略) client通过socke ...