题意略。

思路:

将每一个点的坐标 (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的更多相关文章

  1. [ZOJ3435]Ideal Puzzle Bobble

    题面戳我 题意:你现在处于\((1,1,1)\),问可以看见多少个第一卦限的整点. 第一卦限:就是\((x,y,z)\)中\(x,y,z\)均为正 sol 首先L--,W--,H--,然后答案就变成了 ...

  2. zoj3435(莫比乌斯反演)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3435 题意: 给出一个三维坐标 (x, y, z), 问该点与 ...

随机推荐

  1. 为何出现了trx_mysql_thread_id为0 的事务是什么

    今天巡检时突然发现有很多锁等待超时的情况,原以为是一个简单的小事,一查,结果令人深思. 1.  问题现象 发现日志中出现了大量的 ERROR 1205 (HY000): Lock wait timeo ...

  2. Codeforces比赛注意事项(英语比较好,能翻译题目的可以跳过此文章)

    由题目可知,这篇文章是讲翻译文章的. 当然不是教英语啦 其实cf的比赛对于本蒟蒻最大的挑战就是翻译题目啦 所以我比赛时只能靠各种翻译器去无耻地翻译,然后读中文. 目前较好的翻译器有:百度,谷歌,有道. ...

  3. 使用Docker运行SQL Server

    现在.net core已经跨平台了,大家也都用上了linux用上了docker.跟.net经常配套使用的SQL SERVER以前一直是windows only,但是从SQL Server 2017开始 ...

  4. linux初学者-NFS网络文件系统篇

    linux初学者-NFS网络文件系统篇 在上一篇的SAMBA篇中介绍了linux系统和windows系统之间共用的网络文件系统CIFS,主要用于客户端是windows的情况.在linux系统之间,所用 ...

  5. java练习---11

    package cn.lyhh; class Person{ private String name; private int age; static String city = "A城&q ...

  6. web前端开发-博客目录

    web前端开发是一个新的领域,知识连接范围广,处于设计与后端数据交互的桥梁,并且现在很多web前端相关语言标准,框架库都在高速发展.在学习过程中也常常处于烦躁与迷茫,有时候一直在想如何能够使自己更加系 ...

  7. 消费端如何保证消息队列MQ的有序消费

    消息无序产生的原因 消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端(Consumer) ...

  8. 调试过程中发现按f5无法走进jdk源码

    debug 模式 ,在fis=new FileInputStream(file); 行打断点 调试过程中发现按f5无法走进jdk源码 package com.lzl.spring.test; impo ...

  9. .net持续集成测试篇之Nunit 测试配置

    系列目录 在开始之前我们先看一个陷阱 用到的Person类如下 public class Person:IPerson { public string Name { get; set; } publi ...

  10. 灰度级分层(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 灰度级分层通常用于突出感兴趣的特定灰度范围内的亮度.灰度级分层有两大基本方法. 将感兴趣的灰度范围内的值显示为一个值(比如0),而其他范围的值为另外一个值(255). 将感兴趣的灰度范 ...