ZOJ3435
题意略。
思路:
将每一个点的坐标 (x,y,z) 与 (1,1,1) 相减,得到向量 (x - 1,y - 1,z - 1) 我们实际上就是要求出 这样互质的三元组有多少对就行了。
我们把这个长方体分成3部分:
1.三条坐标棱 2.在坐标棱上的三个表面(除去坐标棱) 3.长宽高分别为[L - 1,W - 1,H - 1]的长方体
三条坐标棱我们只要开3枪,就可以贯穿这个部分,ans += 3。
至于2和3,我们可以用莫比乌斯的第二类反演来解决。
在用莫比乌斯反演时,如果我们一 一枚举因子,就会T,我们来考虑一个sqrt(n)的优化。
比如说19这个数:
19 / 1 = 19,19 / 2 = 9,19 / 3 = 6,19 / 4 = 4,19 / 5 = 3,19 / 6 = 3,19 / 7 = 2,19 / 8 = 2,19 / 9 = 2,19 /10 = 1,......,19 / 19 = 1
在进行反演时,我们必然是通过枚举分母,计算出F(i) = (L / i) * (W / i) * (H / i)。
然而可以发现,7,8,9只要枚举一个就行,10~19也只需要枚举一个就行,如果我们用sum[ i ] 来维护mu[ i ]的前缀和,
那么ans += mu[ 7 ] * 19 / 7 + mu[ 8 ] * 19 / 8 + mu[ 9 ] * 19 / 9 等价于 ans += (sum[ 9 ] - sum[ 6 ]) * 19 / 7。
我们知道对于任意一个数x >= a * b,它的这种小于它且可以产生不同b的a最多有2 * sqrt(x)个。
详见代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn = ; LL l,w,h;
bool check[maxn];
LL prime[maxn];
LL mu[maxn],sum[maxn]; void mobius(){
memset(check,false,sizeof(check));
mu[] = ;
sum[] = ;
int tot = ;
for(LL i = ;i < maxn;++i){
if(!check[i]){
prime[tot++] = i;
mu[i] = -;
}
for(int j = ;j < tot;++j){
if(i * prime[j] > maxn) break;
check[i * prime[j]] = true;
if(i % prime[j] == ){
mu[i * prime[j]] = ;
break;
}
else mu[i * prime[j]] = -mu[i];
}
sum[i] = sum[i - ] + mu[i];
}
} int main(){
mobius();
while(scanf("%lld%lld%lld",&l,&w,&h) == ){
LL ans = ;
LL len = min(l,min(w,h)),last;
for(LL i = ;i < len;i = last + ){
LL a = (l - ) / i,b = (w - ) / i,c = (h - ) / i;
last = min((l - ) / a,min((w - ) / b,(h - ) / c));
ans += (sum[last] - sum[i - ]) * (a * b * c);
}
len = min(l,h);
for(LL i = ;i < len;i = last + ){
LL a = (l - ) / i,b = (h - ) / i;
last = min((l - ) / a,(h - ) / b);
ans += (sum[last] - sum[i - ]) * (a * b);
}
len = min(l,w);
for(LL i = ;i < len;i = last + ){
LL a = (l - ) / i,b = (w - ) / i;
last = min((l - ) / a,(w - ) / b);
ans += (sum[last] - sum[i - ]) * (a * b);
}
len = min(w,h);
for(LL i = ;i < len;i = last + ){
LL a = (w - ) / i,b = (h - ) / i;
last = min((w - ) / a,(h - ) / b);
ans += (sum[last] - sum[i - ]) * (a * b);
}
ans = ans + ;
printf("%lld\n",ans);
}
return ;
}
ZOJ3435的更多相关文章
- [ZOJ3435]Ideal Puzzle Bobble
题面戳我 题意:你现在处于\((1,1,1)\),问可以看见多少个第一卦限的整点. 第一卦限:就是\((x,y,z)\)中\(x,y,z\)均为正 sol 首先L--,W--,H--,然后答案就变成了 ...
- zoj3435(莫比乌斯反演)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3435 题意: 给出一个三维坐标 (x, y, z), 问该点与 ...
随机推荐
- linux初学者-正则表达式
在windows中,是没有办法批量处理文件的,但是在linux系统中,可以通过命令直接处理一系列文件,这些文件的处理就需要用到正则表达式.这同样可以应用与目录. 1.处理多个文件 正则表达式中批量 ...
- Maven国内镜像 Maven阿里云镜像
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name&g ...
- sklearn学习 第一篇:knn分类
K临近分类是一种监督式的分类方法,首先根据已标记的数据对模型进行训练,然后根据模型对新的数据点进行预测,预测新数据点的标签(label),也就是该数据所属的分类. 一,kNN算法的逻辑 kNN算法的核 ...
- 知识图谱学习与实践(4)——Protégé使用入门
1 Protégé简介 Protégé是一个本体建模工具软件,由斯坦福大学基于java语言开发的,属于开放源代码软件.软件主要用于语义网中本体的构建和基于本体的知识应用,是本体构建的核心开发工具,最新 ...
- 【Maven】Mac 使用 zsh 后 mvn 命令就无效
RT -- 解决方法: 打开 .zshrc 文件,将 Maven 环境变量配置加入其中,或者 将 source ~/.bash_profile 添加到 .zshrc 中. PS: 之前搞不懂,每次使用 ...
- 【Android】Genymotion 模拟器 Unable to create virtual device
安装 Genymotion 模拟器的时候报了这个错误,如下: 后来找到了解决方法,见下图: 在 Setting -> Network, 勾选 Use HTTP Proxy, HTTP Proxy ...
- spring注解不支持静态变量注入
spring注解不支持静态变量注入:今天敲代码 自动配置 配置: Animal.java package study01_autoconfig.beanConfig; import org.spri ...
- Nginx + Lua 搭建网站WAF防火墙
前言 对于项目里面只是使用代理等常用功能,在线安装即可,如需制定化模块,则推荐编译安装 PS:本文不仅仅包含Nginx相关的知识点,还包含了逆天学习方法(对待新事物的处理) 官方网站:https:// ...
- 使用vue实现行列转换的一种方法。
行列转换是一个老生常谈的问题,这几天逛知乎有遇到了这个问题.一个前端说,拿到的数据是单列的需要做转换才能够绑定,折腾了好久才搞定,还说这个应该后端直接出数据,不应该让前端折腾. 这个嘛,行列转换在后端 ...
- 记录用友T+接口对接的心酸历程
前言:公司的业务主要是对接财务系统做单据传输或者凭证处理的,难免少不了和各大财务软件做数据对接,其中当然是必须通过接口来传递数据了.于是乎,用友T+的版本来了,对接的工作自然是我来做,可没想到就是这样 ...