hdu4746 Mophues
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746
题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<=n, 1<=b<=m)
分析:
设A(d):gcd(a, b)=d的有多少种
设B(j): gcd(a, b)是j的倍数的有多少种,易知B(j) = (n/j)*(m/j)
则由容斥原理得:(注:不同行的μ是不相同的,μ为莫比乌斯函数)
A(1) = μ(1)*B(1) + μ(2)*B(2) + μ(3)*B(3) + ... + μ(p1*p2...)*B(p1*p2...)
A(2) = μ(1)*B(1*2) + μ(2)*B(2*2) + μ(3)*B(3*2) + ... + μ(p1*p2..)*B(p1*p2..*2)
...
A(d) = μ(1)*B(1*d) + μ(2)*B(2*d) + μ(3)*B(3*d) + ... + μ(p1*p2..)*B(p1*p2..*d)
ans = A(1)+A(2)+...+A(d) = F(1)*B(1) + F(2)*B(2) + ... + F(p1*p2..)*B(p1*p2..)
于是可以枚举公约数i{表示A(i)},利用筛法找出i的倍数j,i对B(j)的贡献系数为:F(j)+=μ(j/i)
总之,求出B(j)的总贡献系数F(j)即可得答案:F(1)*B(1)+F(2)*B(2)+...+F(n)*B(n)
上面没有限制gcd的素因子个数,要限制其实不难,给系数加多一维即可:
F(d)(p)表示:素因子个数<=p时,对B(d)的贡献系数
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> using namespace std;
const int maxn=; int n,m,p;
int vis[maxn];
int prime[maxn];
int cnt;
int num[maxn];
int mu[maxn];
int f[maxn][]; void init()
{
memset(vis,,sizeof(vis));
cnt=;
mu[]=;
for(int i=;i<maxn;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
mu[i]=-;
num[i]=;
}
for(int j=;j<cnt&&i*prime[j]<maxn;j++)
{
vis[i*prime[j]]=;
num[i*prime[j]]=num[i]+;
if(i%prime[j])
mu[i*prime[j]]=-mu[i];
else
{
mu[i*prime[j]]=;
break;
}
}
}
memset(f,,sizeof(f));
for(int i=;i<maxn;i++)
for(int j=i;j<maxn;j+=i)
f[j][num[i]]+=mu[j/i]; for(int i=;i<maxn;i++)
for(int j=;j<;j++)
f[i][j]+=f[i][j-]; for(int i=;i<maxn;i++)
for(int j=;j<;j++)
f[i][j]+=f[i-][j];
} int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&p);
if(p>=)
{
printf("%lld\n",(long long)n*m);
continue;
}
if(n>m)
swap(n,m);
int last;
long long ans=;
for(int i=;i<=n;i=last+)
{
last=min(n/(n/i),m/(m/i));
ans+=(long long)(f[last][p]-f[i-][p])*(n/i)*(m/i);
}
printf("%lld\n",ans);
}
return ;
}
hdu4746 Mophues的更多相关文章
- hdu4746 Mophues 莫比乌斯
/** 题目:hdu4746 Mophues 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746 题意:求x,y在给定范围内gcd(x,y)分解素因子的 ...
- hdu4746 Mophues (莫比乌斯进阶)
参考博客:https://blog.csdn.net/acdreamers/article/details/12871643 题意:满足1<=x<=n,1<=y<=m,并且gc ...
- ACM学习历程—HDU4746 Mophues(莫比乌斯)
Description As we know, any positive integer C ( C >= 2 ) can be written as the multiply of some ...
- HDU 4746 (莫比乌斯反演) Mophues
这道题看巨巨的题解看了好久,好久.. 本文转自hdu4746(莫比乌斯反演) 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<= ...
- hdu 4746 Mophues 莫比乌斯反演+前缀和优化
Mophues 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<=n, 1<=b<=m) 有Q组数据:(n, m, ...
- HDU 4746 Mophues (莫比乌斯反演应用)
Mophues Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327670/327670 K (Java/Others) Total ...
- Mophues HDU - 4746 (莫比乌斯反演)
Mophues \[ Time Limit: 10000 ms\quad Memory Limit: 262144 kB \] 题意 求出满足 \(gcd\left(a,b\right) = k\), ...
- hdu4746莫比乌斯反演进阶题
Mophues Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327670/327670 K (Java/Others)Total S ...
- HDU 4746 Mophues 莫比乌斯反演
分析: http://blog.csdn.net/acdreamers/article/details/12871643 分析参见这一篇 http://wenku.baidu.com/view/fbe ...
随机推荐
- 中国(北方)大学生程序设计训练赛(第一周) (D E)
比赛链接 D题是个二分,每次check复杂度为O(n),类似于xdu_1068,只是一个是求积,一个是求商 #include<bits/stdc++.h> using namespace ...
- 基于Entity Framework的自定义分页,增删改的通用实现
简介 之前写个一个基于Dapper的分页实现,现在再来写一个基于Entity Framework的分页实现,以及增删改的通用实现. 代码 还是先上代码:https://github.com/jinwe ...
- Spark Streaming笔记——技术点汇总
目录 目录 概况 原理 API DStream WordCount示例 Input DStream Transformation Operation Output Operation 缓存与持久化 C ...
- serv-u 多域配置
serv-U后,默认情况下可以通过在浏览器中输入http://IP 的方式登录到serv-u ftp 服务器控制台,也就是说serv-u在80端口监听,这样,如果想配置多个域或者是想在自己电脑上安装A ...
- RobotFramwork安装报错name 'execfile' is not defined
安装RobotFramwork的时候,提示了这个?是什么原因呢? 本机装的是python3.6: 经官方回复得知识因为python的版本不兼容该模块的安装. 官方认定版本是2.7,所以这里推荐大家玩p ...
- SpringBoot系列一(入门,ORM,Transaction,log4j2等)
今天写篇springboot的博客,主要介绍一下springboot搭建以及一些整合. 首先介绍springboot搭建,我今天选择Maven,想用Gradle搭建的就自己百度一下吧,访问" ...
- 浅谈 EF CORE 迁移和实例化的几种方式
出于学习和测试的简单需要,使用 Console 来作为 EF CORE 的承载程序是最合适不过的.今天笔者就将平时的几种使用方式总结成文,以供参考,同时也是给本人一个温故知新的机会.因为没有一个完整的 ...
- Linux安装搜狗输入法教程
最近开始学习linux 在安装输入法中遇到的一些问题,最终成功安装,也得益于网络上的前辈写的文章,现在将全部安装步骤以及遇到的一些问题总结如下: 基本上分三步走 1,添加fcitx的键盘输入法系统 ...
- 从零自学Hadoop(24):Impala相关操作上
阅读目录 序 数据库相关 表相关 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
- Java 字符串截取问题
编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4 public class StringSplit ...