●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 ...
随机推荐
- 设计模式NO.1
设计模式NO.1 根据作业要求完成下列题目: 题目1: (1)要求:某系统日志记录器要求支持多种日志记录方式,如文件记录.数据库记录等:用户可以根据要求动态选择日志记录方式.使用Factory模式来设 ...
- scrapy crawl 源码修改 爬虫多开
import os from scrapy.commands import ScrapyCommand from scrapy.utils.conf import arglist_to_dict fr ...
- NetFPGA Demo ——reference_router_nf1_cml
NetFPGA Demo --reference_router_nf1_cml 前言 本博文主要介绍了reference_router_nf1_cml该demo的一路运行,以及一路上艰难跑通遇到的坑. ...
- C实现单链表
typedef int DataType; typedef struct ListNode { DataType data; struct ListNode* next; }ListNode; //初 ...
- Telnet、SSH和VNC 区别
Telnet Telnet是进行远程登录的标准协议,它是当今Internet上应用最广泛的协议之一.它把用户正在使用的终 端或计算机变成网络某一远程主机的仿真终端,使得用户可以方便地使用远程主机上的软 ...
- python脚本,计算起点终点高程
import arcpy >>> import arcpy ... gd="D:/项目/shp/Pipe.gdb/ZK/GDPOINT" ... gx=" ...
- Python format 格式化函数
str.format() 格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % format 函数可以接受不限个参数,位置可以不按 ...
- 微信开发之SVN提交代码与FTP同步到apache的根目录
SVN是协同开发的,版本控制器,就是几个人同时开发,可以提交代码到SVN服务器,这样就可以协同开发,一般是早上上班首先更新下代码,然后自己修改代码 工作一天之后,修改代码之后,下班之前,更新代码,然后 ...
- c#+wpf项目性能优化之OutOfMemoryException解密
近期,使用c#+wpf开发的软件准备正式投入使用了,使用前进行了大量的测试,测试后发现了一些问题,其中最让人头疼的就是软件的性能问题(稳定性). 这里的稳定性具体表现在机器的cpu占有率和内存使用情况 ...
- Mysql编译安装详解
wget http://mirrors.cnnic.cn/apache/httpd/mysql-5.5.20.tar.gz root@Mysql-server ~]# yum install -y c ...