方格问题

来源:互联网 发布:改良圈算法 matlab 编辑:程序博客网 时间:2024/04/27 12:46

【题目描述】
一个n*m的网格,由n*m个正方形构成。
求其一条对角线穿过的正方形个数。
注意,对角线经过正方形的边角,不算穿过。
【输入格式】
两个正整数n,m(1<=n,m<=1000000000)
【输出格式】
穿过的方格数。
【样例输入】
4 6
【样例输出】
8
【分析】
看到这题,第一反应就是空白。
然后百无聊赖的在几何画板里随意涂鸦,结果还真找到规律了233。
这里写图片描述
上面就是样例。
这条线很明显穿过了8个方格。
细心的人会发现,这条线中间打了一个点。
仔细观察,这个点正是这条线段上唯一(其他的图可能不唯一,甚至可能没有)的格点!
然后可以发现,这个点位于线段的中点(中点是在特殊情况下才发生的,但是不论对于哪个图,原点与这个点组成的线段的长度一定可以被原线段的长度整除)。
构造算法:求出与原点最近的格点,算出这条小线段经过了多少个格子(规律很简单,长+宽-1),然后乘上小线段在原线段中的个数即可。
下面的代码比较有技巧性,合并了不少同类项,得慢慢来喔~

#include<cstdio>int gcd(int x,int y){  if (!y) return x; else return gcd(y,x%y);}int main(){  int x,y;  scanf("%d%d",&x,&y);  int n=gcd(x,y);  printf("%d",(x/n+y/n-1)*n);}
3 0
原创粉丝点击