我相信这道题题意很简单,就是求平面上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;
}