题意:

给定一副n*m的格子图, 问从左上角的点开始往右下角滑,碰到墙壁就反弹, 碰到角落就停止, 问恰好经过一次的格子有多少个。

如图,恰好经过一次的格子有39个。

分析:

首先要引入两个概念, “路径长”,“格子数”。

路径长指的是整段路程的长度,如果走过同一个格子两次那么就算是2步。

格子数指的是整段路程经过的格子。

如果一个图是9*9(形如n*n)的, 那么就是从左上角一直到右下角, 走过的“路径长”恰好等于“格子数”,没有任何的格子被走过两次。

但对于一幅9 * 15这样不规则的图,“格子数”为“48”,“路径长”为57。

如果把格子都平移成一条直线的话, 那么有一些格子就会存在“共用”。上图中1~9号都成为“共用点”,其中“3、6、9”为行共用,“2、4、5、7、8、10”为列共用点,1和11分别给起点和终点。

只考虑1 - 2 - 3 - 4 - 5 - 6 这条连线, 如果把他们平移成行的话, 那么只有15 + 14的“路径长” , 并非两行15*2 =30 “路径长”。 因为3号顶点是这两行共用的, 不能单独算。整幅图而言,因为行共用点有3个, 所以最后如果都算行平移的话会有15 + (15-1)*3 = 57“路径长”, 如果都算列平移同样会有9 + (9-1)*6 = 57“路径长”。

那么我们考虑将一个n*m的“路径长”,放大成最小倍数使其变为没有“共用点”的 a*a图便于我们运算。 那么a应该等于 (lcm(n-1,m-1)), 行放大倍数为a/n, 列放大倍数为a/m。

注意最后再加上1,因为“共用点总比边数少1”,换而言之就是有一条边是没有公共点的, 我们都按“lcm(n-1,m-1)”倍数去放大的话就会少算了一格。

这样我们就能得出“路径长”的公式为 lcm(n-1,m-1) + 1。

考虑2*3的格子, 现在行公用点其实是0, 格子共有3*1 = 3 个, 竖公共点有1个, 格子共有2+(2-1)*1 = 3 个。

接下来我们处理,“路径长” 和“格子数”的关系。

由图可得, 因为有些格子走了2次(至多2次),所以"路径长”算多了一次。

其实 “路径长” =“走过一次格子数” * 1 + “走过两次格子数” * 2。

那么我们既然要求的是“走过一次的格子数”, 而且“路径长“也算出来了, 就可以得出。

"路径长" - “走过两次格子数”*2   =  “走过一次格子数” (即都视为走过两次的, 减掉路径就知道走过一次格子有多少)。

 


所以问题就转化为求“格子数”的问题了,

而且发现没有, 9 * 15的图中,按行算只有 4 , 按列算只有7, 恰好是 lcm(8,14) = 56

56/ 8  = 7和  56 / 14 = 4 的结果。

这就说明, 我们用“共用点”计算的行列,是和我们放大的倍数有关系的。

那些走过两次的点, 其实就是行列的交叉点, 推了一下大概的公式,大概就是

#include<bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b){
return b == ? a : gcd(b,a%b);
}
long long lcm(long long a, long long b){
return a*b/gcd(a,b);
}
int main(){
long long n , m;
while(~scanf("%lld %lld", &n, &m)){
long long l = lcm(n-,m-);
long long a = l/(m-) , b = l/(n-);
printf("%lld\n",l - a*b + a + b);
}
return ;
}

hihocoder 1584 Bounce (数学 && 规律) ACM-ICPC北京赛区2017网络赛的更多相关文章

  1. hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-题目9 : Minimum【线段树】

    https://hihocoder.com/problemset/problem/1586 线段树操作,原来题并不难..... 当时忽略了一个重要问题,就是ax*ay要最小时,x.y可以相等,那就简单 ...

  2. 【分类讨论】【计算几何】【凸包】hihocoder 1582 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 E. Territorial Dispute

    题意:平面上n个点,问你是否存在一种黑白染色方案,使得对于该方案,无法使用一条直线使得黑色点划分在直线一侧,白色点划分在另一侧.如果存在,输出一种方案. 如果n<=2,显然不存在. 如果所有点共 ...

  3. 【线段树】hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I. Minimum

    题意:给你一个序列(长度不超过2^17),支持两种操作:单点修改:询问区间中最小的ai*aj是多少(i可以等于j). 只需要线段树维护区间最小值和最大值,如果最小值大于等于0,那答案就是minv*mi ...

  4. 【最短路】【Heap-dijkstra】hihocoder 1587 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 J. Typist's Problem

    题意:给你一个串,仅含有a~g,且每个字母只出现最多一次.和一个光标初始位置,以及一个目标串,问你最少要多少的代价变化成目标串. 有五种操作:在光标前添加一个未出现过的字母,代价1. 删除光标前或者光 ...

  5. hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1584 : Bounce 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 For Argo, it is very interesting watching a cir ...

  6. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  7. hihoCoder 1582 Territorial Dispute 【凸包】(ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1582 : Territorial Dispute 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In 2333, the C++ Empire and the Ja ...

  8. hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1586 : Minimum 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2 ...

  9. hihoCoder 1631 Cats and Fish(ACM-ICPC北京赛区2017网络同步赛)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are many homeless cats in PKU campus. They are all happy ...

随机推荐

  1. Udp实现省略编码

    class My_Socket(socket.socket): def __init__(self, encoding='utf-8'): self.encoding = encoding super ...

  2. 使用ansible对远程主机上的ssh公钥进行批量分发

    使用ansible对远程主机上的ssh公钥进行批量分发或者是删除修改操作 ansible内置了一个authorized_key模块,这个模块很好用,我们使用这个模块可以对远程 主机上的ssh公钥进行批 ...

  3. [已读]JavaScript编程精解

    译者汤姆大叔,应该很多人都知道,他写了一系列的关于闭包与作用域理解的文章,但是由于创建了一些我不理解的新名词,我不爱看. <JavaScript编程精解>算是买得比较早的一本书,那会大肆搜 ...

  4. Bootstrap中的datetimepicker浅谈

    从古至今,人们都习惯用某个时间来标记某个事件的发生.我们在写管理后台的时候,重中之中也是这个时间的设置.在问题出现的时候,我们是查看日志的时候,就可以根据这个时间段来查找这个问题出现点. 在使用时间控 ...

  5. AJPFX关于枚举,泛型详解

    枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义:public enum Color{RED,BLUE,BLACK,YELLOW,G ...

  6. 【转】码云source tree 提交超过100m 为什么大文件推不上去

    码云source tree 提交超过100m 为什么大文件推不上去 2017年01月12日 16:50:51 阅读数:7634 git -c diff.mnemonicprefix=false -c ...

  7. git 配置免密上传,配置ssh key

    1.windows 打开git bash 控制台,linux 直接打开命令控制台,输入 ssh-keygen 一直enter 下一步 2.生成的文件windows 存放在c://users 路径下,l ...

  8. (四)docker创建私人仓库

    (一) 简介 仓库(Repository)是集中存放镜像的地方.仓库可以 被认为是一个具体的项目或目录.例如对于仓库地址 docker.sina.com.cn/centos:centos63 来说,d ...

  9. PE基础1

    PE文件概述 文件格式 .png ..mp4..gif..dll等等,这些文件都具有不同格式 不能随意修改这些文件,否则将无法打开 PE文件(可执行文件) 学习PE文件目标 掌握PE文件就掌握wino ...

  10. emacs - GNU Emacs

    总览 (SYNOPSIS) emacs [ command-line switches ] [ files ... ] 描述 (DESCRIPTION) GNU Emacs 是 Emacs 的 一个 ...