题链:

http://acm.hdu.edu.cn/showproblem.php?pid=1695

题解:

容斥。

莫比乌斯反演,入门题。

问题化简:求满足x∈(1~n)和y∈(1~m),且gcd(x,y)=1的(x,y)的对数。

下文默认$n \leq m$


1.容斥

(先写了一个的裸的容斥。)

令$f(k)为gcd(x,y)=\lambda k的(x,y)的对数$

$ANS=f(0种质数的积)-f(1种质数的积)+f(2种质数的积)-\cdots+(-1)^mf(m种质数的积)$

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100500
using namespace std;
bool np[MAXN],can[MAXN];
int T[MAXN];
void Prime_Sieve(){
static int prime[MAXN],pnt;
for(int i=2;i<=100000;i++){
if(!np[i]) prime[++pnt]=i,T[i]=1,can[i]=1;
for(int j=1;j<=pnt&&i<=100000/prime[j];j++){
np[prime[j]*i]=1;
T[prime[j]*i]=T[i]+(i%prime[j]!=0);
can[prime[j]*i]=can[i]&&(i%prime[j]!=0);
if(i%prime[j]==0) break;
}
}
}
long long work(int b,int d){
long long ret=1ll*b*d,tmp;
for(int i=2;i<=b;i++) if(can[i]){
tmp=(T[i]&1?-1:1)*1ll*(b/i)*(d/i);
ret+=tmp;
}
return ret;
}
int main(){
Prime_Sieve(); int a,b,c,d,k,Case; long long ans;
//while(~scanf("%d",&n)) printf("%d 的质数因子有 %d 种\n",n,T[n]);
scanf("%d",&Case);
for(int i=1;i<=Case;i++){
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==0){printf("Case %d: 0\n",i); continue;}
if(b>d) swap(b,d);
ans=work(b/k,d/k);
ans-=work(b/k,b/k)/2;
printf("Case %d: %lld\n",i,ans);
}
return 0;
}

2.莫比乌斯反演

令$f(k)为gcd(x,y)=k的(x,y)的对数$

$F(k)为gcd(x,y)=\lambda k的(x,y)的对数$

显然$F(k)=\sum_{k|d}{f(d)},且F(k)=\lfloor\frac{n}{k}\rfloor\times\lfloor\frac{m}{k}\rfloor$

那么由莫比乌斯反演公式的形式二(倍数关系那个式子):

即 $\mathbf{f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d),需满足F(n)=\sum_{n|d}f(d)}$

所以我们要求的答案:$f(1)$可以化为如下形式:

$f(1)=\sum_{1|d}\mu(\frac{d}{1})F(d)$

$\quad\quad=\sum_{d=1}^{n}\mu(d)\times\lfloor\frac{n}{d}\rfloor\times\lfloor\frac{m}{d}\rfloor$

感觉还是$O(n)$的呀,和上面的容斥没什么区别呢?

其实对于这种式子,有一个trick可以把其复杂度优化到$O(\sqrt{n})$

看看这样一个例子:

$\lfloor \frac{100}{34} \rfloor=\lfloor \frac{100}{35} \rfloor=\cdots=\lfloor\frac{100}{50}\rfloor=2$

即在向下取整的情况下,$F(k)$函数会有很多段相同的取值,

所以可以靠这个来把时间优化到$O(\sqrt{n})$。

具体实现看下面代码中的$work()函数$,(学习别人的,很巧妙,很简洁,但是也很迷。。。)

/*
http://acm.hdu.edu.cn/showproblem.php?pid=1695
莫比乌斯反演,入门题。
令 f(k)=gcd(x,y)
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100500
using namespace std;
int mu[MAXN],pmu[MAXN];
void Mobius_Sieve(){
static bool np[MAXN]; mu[1]=1; pmu[1]=1;
static int prime[MAXN],pnt;
for(int i=2;i<=100000;i++){
if(!np[i]) prime[++pnt]=i,mu[i]=-1;
pmu[i]=pmu[i-1]+mu[i];
for(int j=1;j<=pnt&&i<=100000/prime[j];j++){
np[prime[j]*i]=1;
if(i%prime[j]) mu[i*prime[j]]=-mu[i];
else mu[i*prime[j]]=0;
if(i%prime[j]==0) break;
}
}
}
long long work(int b,int d){
long long ret=0,tmp;
for(int i=1,last;i<=b;i=last+1){
last=min(b/(b/i),d/(d/i));
tmp=1ll*(pmu[last]-pmu[i-1])*(b/i)*(d/i);
ret+=tmp;
}
return ret;
}
int main(){
Mobius_Sieve();
int a,b,c,d,k,Case; long long ans;
scanf("%d",&Case);
for(int i=1;i<=Case;i++){
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==0){printf("Case %d: 0\n",i); continue;}
if(b>d) swap(b,d);
ans=work(b/k,d/k);
ans-=work(b/k,b/k)/2;
printf("Case %d: %lld\n",i,ans);
}
return 0;
}

(诶,这个莫比乌斯反演得到的式子和那个容斥的到的好像是一样的!)

●HDU 1695 GCD的更多相关文章

  1. HDU 1695 GCD 容斥

    GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...

  2. HDU 1695 GCD(欧拉函数+容斥原理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, ...

  3. HDU 1695 GCD#容斥原理

    http://acm.hdu.edu.cn/showproblem.php?pid=1695 翻译题目:给五个数a,b,c,d,k,其中恒a=c=1,x∈[a,b],y∈[c,d],求有多少组(x,y ...

  4. hdu 1695 GCD 欧拉函数 + 容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=1695 要求[L1, R1]和[L2, R2]中GCD是K的个数.那么只需要求[L1, R1 / K]  和 [L ...

  5. HDU 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a ...

  7. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. HDU 1695 GCD (莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. hdu 1695 GCD(莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. bug终结者 团队作业第四、五周

    bug终结者 团队作业第四.五周 博客编辑者:20162322朱娅霖 本周学习任务: 团队协作完成<需求规格说明书> 工作流程 第四周 团队成员各自完成蓝墨云班课中<需求规格说明书& ...

  2. 关于DLL的创建与使用简单描述(C++、C#)

    前言 前一段时间在学关于DLL的创建与调用,结果发现网络上一大堆别人分享的经验都有点问题.现在整理分享一下自己的方法. 工具 Microsoft Visual Studio 2017 depends ...

  3. python3爬虫之入门和正则表达式

    前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享:爬虫说的简单,就是去抓取网路的数据进行分析处理:这章主要入门,了解几个爬虫的小测 ...

  4. OO前三次作业总结

    一.第一次作业 1.程序设计分析 ![img](s1.ax1x.com/2018/04/02/CSgoSU.png) 图1 第一次作业类图 ![name](https://images2018.cnb ...

  5. hi-nginx-1.4.2发布,多项重要更新

    支持多种编程语言混合开发web应用的通用服务器hi-nginx-1.4.2已经发布了. 此次发布包含多项重要更新: 支持python2和3,通过编译选项--with-http-hi-python-ve ...

  6. nyoj 公约数和公倍数

    公约数和公倍数 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 小明被一个问题给难住了,现在需要你帮帮忙.问题是:给出两个正整数,求出它们的最大公约数和最小公倍数. ...

  7. 17-TypeScript代理模式

    在有些情况下,我们需要把客户端真正调用的类和方法隐藏起来,而通过暴露代理类给客户端.客户端调用代理类的方式就可以访问到真实类提供的功能. abstract class Called{ protecte ...

  8. php的数组的函数

    1.可以将一个二位数组转化成两个一维数组,没有指定键就是默认的索引 注意二位数组有几种类型,其中最常见的一种是外层循环是一个索引数组,然后内层是一个关联数组.这种通过便利第一层,然后第二层指定关联词就 ...

  9. Solaris 11 system package 安装与更新(如:assembler)

    最近在VirtualBox虚拟机中导入了Solaris 11.3.在里面安装Oracle数据库时,先行条件检查没通过,提示缺少程序包assembler. 在网上看了许多,这方面的信息还比较少.最后在O ...

  10. AngularJS1.X学习笔记10-自定义指令(下)

    继续继续,学完这个部分就去吃饭.引用自由男人的话作为本文的开始:“默认情况下,链接函数被传入了控制器的作用域,而该控制器管理着的视图包含了指令所应用到的元素”.果然像是绕口令,还是看看你的例子比较好. ...