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), 问该点与 ...
随机推荐
- canal同步MySQL数据到ES6.X
背景: 最近一段时间公司做一个技术架构的更改,由于之前使用的solr和目前的业务不太匹配,具体原因不多说啦.所以要把数据放到Elasticsearch中进行快速的搜索,这是便产生了一个数据迁移的需求, ...
- Eclipse Other Projects小问题
Eclipse 不知什么时候多了个 "Other Projects" 文件夹,所有的项目又多了一层目录,如图所示: 虽然对功能没任何影响,但每次打开有些麻烦,多少感觉有些不爽…… ...
- 如何在github开源自己的项目
1.到GitHub上注册自己的账号.https://github.com/ 2.创建第一个代码仓库. 选择public,public权限表示所有人都能够查看这些代码并下载.然后点击Create rep ...
- 语音控制单片机工作【百度语音识别,串口发送数据到单片机】【pyqt源码+软件】!!
前些天闲着没事,就做了个语音识别结合串口发送指令的软件,用的是pyqt写的,软件打开后对着笔记本的话筒说话, 他就能识别返回文字结果,然后匹配语音中的关键词,如果有关键词就发送关键词对应的命令,比如语 ...
- linux下mysql无法看到3306端口监听
这个问题搞定了,原因是我的my.cnf有话:skip-network注释掉,然后运行netstat -an|grep 3306 就可以看到了
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- kubernetes离线包分析
k8s离线包解析 产品地址 鸣谢 大家好,首先感谢大家对我们产品的支持,特别是一些老客户的持续支持,让我可以有动力把这个事情持续进行下去. 感谢大家对付费产品的认可,尊重付费 产品介绍 我们专注于k8 ...
- 关于AJAX的跨域问题
最近过年的这几天在做毕业设计的时候遇到了一个关于AJAX的跨域问题,本来我是想要用一下聚合数据平台提供的天气预报的接口的,然后做一个当地的天气情况展示,但是在使用AJAX的时候,被告知出现错误了. 这 ...
- Vector的一些事
1.利用数组对vector进行初始化方法 当然有许多方法,这里就讲一种.原因简单,其他方式请参见这个博文:http://www.cplusplus.me/1112.html , , , , -}; v ...
- HTML/CSS:display:flex 布局教程
网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...