URAL 1139. City Blocks (数论)

27 篇文章 0 订阅

1139. City Blocks

Time limit: 1.0 second
Memory limit: 64 MB
The blocks in the city of Fishburg are of square form. N avenues running south to north and M streets running east to west bound them. A helicopter took off in the most southwestern crossroads and flew along the straight line to the most northeastern crossroads. How many blocks did it fly above?
Note. A block is a square of minimum area (without its borders).

Input

The input contains N and M separated by one or more spaces.1 < N, M < 32000.

Output

The number of blocks the helicopter flew above.

Samples

inputoutput
4 3
4
3 3
2

Notes

The figures for samples:
Problem illustration
Problem Source: Quarterfinal, Central region of Russia, Rybinsk, October 17-18 2001




解析:先令n = n - 1, m = m - 1:

考虑n或m只有1的情况,不妨设m = 1,那么图形就变成了一个n个小正方体拼在一起的长方体,显然答案为n,因为灰机穿过了n个街区,我们可以认为,每穿过一条竖线,就会多穿过一个街区(包括第一条竖线,不包括最后一条竖线)。
那么当n, m>1的时候,也是每穿过一条竖线,多穿过一个街区,每穿过一条横线,多穿过一个街区。但是答案却不是n + m。
因为当灰机穿过一个整点(横纵坐标均为整数)的时候,同时穿过横线和竖线,多穿过的街区是一样的。
对于灰机的路线来讲,穿过的整点数为gcd(n, m)(不算最后一个)
第一个穿过的整点为(1,1),第二个为(n / gcd, m / gcd),第三个为(n / gcd * 2, m / gcd * 2)……最后一个为(n / gcd * (gcd - 1), m / gcd * (gcd - 1))。一共gcd个。这里的gcd为gcd(n, m)。
于是,n + m减掉穿过整点的时候重复加上的街区,则答案为n + m - gcd(n, m)。




AC代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF){
        n --; m --;
        printf("%d\n", n + m - __gcd(n, m));     //__gcd(n, m)是algorithm头文件里的库函数
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值