A - How Many Points?LightOJ - 1077(gcd+数学证明)

在这里插入图片描述
我相信这道题题意很简单,就是求平面上x0y两点中间整数点的个数(包括端点);也就是格点;其实题目上什么是格点已经说了;
就是x,y轴都是整数的点;
答案分为两种情况:
1.斜率不存在,答案就是abs(Ay-By)+1;
2.斜率存在,答案就是gcd(abs(Ay-By),abs(Ax-Bx))+1;
第一种情况很容易理解(用笔画一下就出来了);
第二种证明:
在这里插入图片描述
在这里插入图片描述
注意这里的gcd为gcd(abs(Ay-By),abs(Ax-Bx));为什么+1呢?其实用手算一下就可以知道除法是倍数,需要+1才是点数
所以AC代码就出来了:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
	return b?gcd(b,a%b):a;
}
int main(){
	ll T,g=1;
	scanf("%lld",&T);
	ll Ax,Ay,Bx,By;
	while(T--){
		  scanf("%lld %lld %lld %lld",&Ax,&Ay,&Bx,&By);
		  if(Ax==Bx)printf("Case %lld: %lld\n",g++,abs(By-Ay)+1);//斜率不存在
		  else{//斜率存在
		  	  ll t=gcd(abs(Ax-Bx),abs(Ay-By));
		  	  printf("Case %lld: %lld\n",g++,t+1);
		  }
	}
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值