题链:

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. 需求分析&原型改进

    需求&原型改进 一.给目标用户展现原型,与目标用户进一步沟通理解需求. 1.用户痛点:需要随时随地练习四则运算,并能看到用户的统计数据. 2.用户反馈:较好地解决练习需求,若能加入班级概念则更 ...

  2. 201621123031 《Java程序设计》第12周学习总结

    作业12-流与文件 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 在Java中的java.io包中定义了许多类专门负责处理各种方式的输入与输出.其中,所有输入 ...

  3. 201621123044 《Java程序设计》第六周实验总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...

  4. SQL数据库开发中的一些经典代码

    1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as  2.数据库加密: ...

  5. 使用XIB的UITableViewCell自适应,以及出现的问题进行解决

    1.首先需要定义一个属性 @property (nonatomic, strong) UITableViewCell *prototypeCell; 2.在创建完tableView后加上如下代码 se ...

  6. 2017北京国庆刷题Day1 afternoon

    期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目 ...

  7. leetcode题解 6.ZigZag Conversion

    6.ZigZag Conversion 题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a gi ...

  8. 新概念英语(1-113)Small Change

    Lesson 113 Small Change 零钱 Listen to the tape then answer this question. Who has got some change?听录音 ...

  9. 基于UDP协议的控制台聊天程序(c++版)

    本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...

  10. Beautifulsoup4

    kindEditor 1 官网:http://kindeditor.net/doc.php 2 文件夹说明: ├── asp asp示例 ├── asp.net asp.net示例 ├── attac ...