题意:

有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 ;
}

最新文章

  1. 技术笔记:Indy控件发送邮件
  2. JAVA学习博客---2015-7
  3. HTML5系列四(特征检测、Modernizr.js的相关介绍)
  4. 如何在C语言中调用Swift函数
  5. request模块提交数据
  6. POJ 1904 King&#39;s Quest 强联通分量+输入输出外挂
  7. HDU1465 第六周L题(错排组合数)
  8. vi/vim 键盘
  9. jQuery.validate 中文 API
  10. 由命名空间函数而引发思考--js中的对象赋值问题
  11. C# 课堂总结2-数据类型及转换方式
  12. iOS单元测试
  13. 用c3m自动生成的化学机理文件导入mfix里需要注意的一些问题
  14. Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute
  15. 日积月累--Lock锁机制
  16. 2018牛客网暑期ACM多校训练营(第一场)A Monotonic Matrix(LGV)
  17. .net 缓存
  18. ldap集成zabbix
  19. Spring WebSocket踩坑指南
  20. Join 和 Apply 用法全解

热门文章

  1. Macos Coco2d-x Android开发
  2. 如何解决eclipse上的Android程序“Please ensure that adb is correctly located at &#39;D:\eclipse\sdk\platform-tools\adb.exe&#39; and can be executed.”小问题?
  3. SSL证书制作
  4. POJ 1330 Nearest Common Ancestors(LCA模板)
  5. C#学习第六天
  6. php 写model层
  7. eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass method
  8. IOS中截屏的实现,很简易的方法
  9. JavaScript那些事儿(01): 对象
  10. SAS学习笔记