题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3435

题意: 给出一个三维坐标 (x, y, z), 问该点与 (1, 1, 1) 组成的长方体中有多少条经过点 (1, 1, 1) 的直线 .

思路:  显然本题的难点是线段不能重复计算, 比如 (1, 1, 1) 到 (2, 2, 2) 和 (1, 1, 1) 到 (4, 4, 4) 同一条直线 .

为了计算方便, 我们先将这个问题替换成它的等价问题: 求 (0, 0, 0), (x - 1, y - 1 , z - 1) 组成的长方体中有多少条经过 (0, 0, 0) 的直线 .

通过画图可以发现当且仅当点 (j, k, l) 满足 gcd(j, k, l) = 1 时累计直线 (0, 0, 0), (j, k, l) 刚好能累加到所有直线并且不会重复计算 .

然后我们将满足条件的直线分为 3 部分:

1. 从 (0, 0, 0) 出发的 3 条棱;

2. 从 (0, 0, 0) 出发的 3 个表面;

3. 从 (0, 0, 0) 出发到长方体内部的直线;

对于 1, 显然满足条件的直线为 3 条;

对于 2, 满足条件的直线数目为 gcd(j, k) = 1 的直线数目加 gcd(j, l) = 1 的直线数目加 gcd(k, l) = 1 的直线数目, 其中 1 <= j <= x -1, 1 <= k <= y - 1, 1 <= l <= z -1;

对于 3, 满足条件的直线数目为 gcd(j, k, l) = 1 的直线数目, 其中 1 <= j <= x -1, 1 <= k <= y - 1, 1 <= l <= z -1;

显然对于上面的计算部分都可以用莫比乌斯反演在线性时间内完成 .

代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define ll long long
using namespace std; const int MAXN = 1e6 + ; bool check[MAXN];
int prime[MAXN], mu[MAXN], sum[MAXN]; void Moblus(void){
memset(check, false, sizeof(check));
int tot = ;
mu[] = ;
sum[] = ;
for(int i = ; i < MAXN; i++){
if(!check[i]){
prime[tot++] = i;
mu[i] = -;
}
for(int j = ; j < tot && prime[j] * i < MAXN; j++){
check[prime[j] * i] = true;
if(i % prime[j] == ){
mu[i * prime[j]] = ;
break;
}else mu[i * prime[j]] = -mu[i];
}
sum[i] = sum[i - ] + mu[i];
}
} ll solve(int x, int y){
ll ans = ;
if(x > y) swap(x, y);
for(int i = , la = ; i <= x; i = la + ){
la = min(x / (x / i), y / (y / i));
ans += (ll)(sum[la] - sum[i - ]) * (x / i) * (y / i);
}
return ans;
} ll solve(int x, int y, int z){
ll ans = ;
if(x > y) swap(x, y);
if(x > z) swap(x, z);
for(int i = , la = ; i <= x; i = la + ){
la = min(min(x / (x / i), y / (y / i)), z / (z / i));
ans += (ll)(sum[la] - sum[i - ]) * (x / i) * (y / i) * (z / i);
}
return ans;
} int main(void){
Moblus();
int x, y, z;
while(~scanf("%d%d%d", &x, &y, &z)){
x--;
y--;
z--;
ll ans = ;
ans += solve(x, y);
ans += solve(x, z);
ans += solve(y, z);
ans += solve(x, y, z);
printf("%lld\n", ans);
}
return ;
}

zoj3435(莫比乌斯反演)的更多相关文章

  1. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  2. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  3. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  4. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  5. 莫比乌斯函数筛法 & 莫比乌斯反演

    模板: int p[MAXN],pcnt=0,mu[MAXN]; bool notp[MAXN]; void shai(int n){ mu[1]=1; for(int i=2;i<=n;++i ...

  6. 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  7. POI2007_zap 莫比乌斯反演

    题意:http://hzwer.com/4205.html 同hdu1695 #include <iostream> #include <cstring> #include & ...

  8. hdu.5212.Code(莫比乌斯反演 && 埃氏筛)

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  9. CSU 1325 莫比乌斯反演

    题目大意: 一.有多少个有序数对(x,y)满足1<=x<=A,1<=y<=B,并且gcd(x,y)为p的一个约数: 二.有多少个有序数对(x,y)满足1<=x<=A ...

随机推荐

  1. Sed 命令详解 正则表达式元字符

    1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  2. Struts2与OGNL

    Action会自动放入值栈,成员变量会自动放入root区 如果是方法中的对象 要放入值栈 push()或者getRoot().push(); 界面取值  直接用对象的属性名进行取值

  3. Selenium-浮层的操作

    实现-百度登录浮层-输入登录用户名 #! /usr/bin/env python #coding=utf-8 ''' 百度首页-登录浮层 ''' from selenium import webdri ...

  4. Java企业微信开发_00_源码及资源汇总贴

    一.源码 此系列教程的源码我都放在了github上,欢迎fork以及关注. 传送门:https://github.com/shirayner/WeiXin_QiYe_Demo/tree/master ...

  5. leetcode 34 Search for a Range(二分法)

    Search for a Range Given a sorted array of integers, find the starting and ending position of a give ...

  6. linux命令学习笔记(9):touch 命令

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. .命令格式: touch [选项]... 文件... .命令参数: -a 或--t ...

  7. CTS 2019 Pearl

    CTS2019 Pearl 每种颜色有奇偶两种情况,只有偶数和只有奇数个,其对应的的指数型生成函数分别为 \(\frac{e^x+e^{-x}}2,\frac{e^x-e^{-x}}2\) 考虑选出现 ...

  8. Oracle 12c 多租户在 CDB 中 Plug A PDB,Unplugging A PDB

    Oracle 数据库 12 c 中介绍了多租户选项允许单个容器数据库 (CDB) 来承载多个单独的可插拔数据库 (PDB).本文简单的演示了如何在 CDB 中 Plug A PDB,Unpluggin ...

  9. glusterfs安装配置简单使用

    GlusterFS是一种分布式分布式文件系统,默认采用无中心完全对等架构,搭建维护使用十分简单,是很受欢迎的分布式文件系统. 官网https://www.gluster.org/,官网上表示Glust ...

  10. 一个有关Golang变量作用域的坑

    转自:http://tonybai.com/2015/01/13/a-hole-about-variable-scope-in-golang/ 临近下班前编写和调试一段Golang代码,但运行结果始终 ...