问题描述:
求直线ax+by+c=0上有多少个整数点(x,y)满足x属于[x1,x2],y属于[y1,y2]。
问题分析:算法竞赛入门经典P313
#include <iostream>
#include<cstdio>
using namespace std;
//欧几里得算法
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
//扩展欧几里得算法
void gcd(int a,int b,int& d,int& x,int& y){
if(!b){
d=a;
x=1;
y=0;
}else{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main() {
int a,b,d,x,y,c;
int x1,x2,y1,y2;
scanf("%d%d%d",&a,&b,&c);
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
c=-c;
d=gcd(a,b);
gcd(a,b,d,x,y);
if(c%d==0){
x=x*c/d,y=y*c/d;
}else{
printf("NEVER!");
return 0;
}
int ans=0;
int k=(x1-x)*d/b;
for(;x+k*(b/d)<=x2;k++){
if(y-k*(a/d)<=y2&&y-k*(a/d)>=y1){
printf("x=%d y=%d \n",x+k*(b/d),y-k*(a/d));
ans++;
}
}
printf("%d",ans);
return 0;
}