●HDU 1695 GCD
题链:
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的更多相关文章
- HDU 1695 GCD 容斥
GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...
- HDU 1695 GCD(欧拉函数+容斥原理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, ...
- 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 ...
- hdu 1695 GCD 欧拉函数 + 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=1695 要求[L1, R1]和[L2, R2]中GCD是K的个数.那么只需要求[L1, R1 / K] 和 [L ...
- HDU 1695 GCD (欧拉函数+容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 GCD 欧拉函数+容斥原理+质因数分解
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 GCD (莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1695 GCD(莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- C语言博客作业--函数
一.PTA实验作业 题目1 (6-7) (1).本题PTA提交列表 (2)设计思路 设计第一个函数判断是否完数int factorsum( int number ) 定义sum.i:sum初始化归0, ...
- Unix下zfs文件系统重组RAID-5后可以这样恢复
存储做的RAID-5, SCSI硬盘,操作系统是FreeBSD,文件系统是zfs.本案例共有12块硬盘,11块硬盘里有数据,1块硬盘是热备盘.其中第6块数据硬盘出现故障,重组时需要将其剔除. 物理盘: ...
- 自己动手写CPU(基于FPGA与Verilog)
大三上学期开展了数字系统设计的课程,下学期便要求自己写一个单周期CPU和一个多周期CPU,既然要学,就记录一下学习的过程. CPU--中央处理器,顾名思义,是计算机中最重要的一部分,功能就是周而复始地 ...
- 06_Python的数据类型3元组,集合和字典_Python编程之路
上一节跟大家讲了Python的列表,当然不是完整的讲完,后续我们还会提到,这一节我们还是来讲Python的数据类型 首先要讲到的就是元组 元组其实拥有列表的一些特性,可以存储不同类型的值,但在某些方面 ...
- csrf学习笔记
CSRF全称Cross Site Request Forgery,即跨站点请求伪造.我们知道,攻击时常常伴随着各种各样的请求,而攻击的发生也是由各种请求造成的. CSRF攻击能够达到的目的是使受害者发 ...
- Python之旅.第四章.模块与包.总结(未完待遇)
一.模块 模块: 一系列功能的集合体,在python中一个py文件就是一个模块,模块名就是py文件的文件名: 模块的好处: 1.减少重复的代码 2.拿来主义 定义模块: 就是创建一个py文件: 使用模 ...
- 爬虫小探-Python3 urllib.request获取页面数据
使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...
- python 中os.path.join 双斜杠的解决办法
这两天在写东西的时候遇到了这个问题,主要是上传图片之后,无法在页面展示,原因就出在用join 拼接的路径中出现了"\"而造成的. >>> import os &g ...
- SecureCRT 7.3注册机激活
SecureCRT是一款很好用的远程登陆管理工具 工具和注册机下载链接:http://pan.baidu.com/s/1jImWiMU 密码:0yox 以管理管运行keygen.exe(一定要以管理员 ...
- 详解get请求和post请求参数中文乱码的解决办法
首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...