很不错的题,加深了我对exgcd的理解
(以前我认为做题就是搜索、dp...原来数学也很重要)
理解了几个小时,终于明白了。但我什么都不打算写。
看代码吧:
#include<iostream>
using namespace std; int exgcd(int a,int b,int& x,int&y){//扩展欧几里得
if(b==){
x=; y=;
return a;
}
int x2,y2;
int d=exgcd(b,a%b,x2,y2);
x=y2; y=x2-(a/b)*y2;
return d;
} int main(){
int T; cin>>T;
while(T--){
int a,b,c,lx,hx,ly,hy;
cin>>a>>b>>c>>lx>>hx>>ly>>hy;
c=-c;
if(lx>hx||ly>hy||(a==&&b==&&c!=)){cout<<<<endl; continue;}
if(a==||b==){
long long num_x,num_y;
if(a==)num_x=hx-lx+;
else if(c%a==&&(c/a)<=hx&&(c/a)>=lx)num_x=;
else num_x=;
if(b==)num_y=hy-ly+;
else if(c%b==&&(c/b)<=hy&&(c/b)>=ly)num_y=;
else num_y=;
cout<<num_x*num_y<<endl;
continue;
}
int x,y;
int d=exgcd(a,b,x,y);
if(c%d!=){cout<<<<endl; continue;}
int k=c/d;
x*=k; y*=k;
a/=d; b/=d;
// cout<<x<<' '<<y<<endl;
if(x<lx){
while(x<lx){
x+=b;
y-=a;
}
}
else{
while(x>=lx){
x-=b;
y+=a;
}
x+=b; y-=a;
} long long ans=;
while(x<=hx){
if(y<=hy&&y>=ly){
ans++;
// cout<<x<<' '<<y<<endl;
}
x+=b;
y-=a;
}
cout<<ans<<endl;
}
}