题目大意:
给定a,b,c,x1,x2,y1,y2
求解二元一次不定方程
ax+by+c=0
x∈[x1,x2],y∈[y1,y2]的解的个数
看到二元一次不定方程就想到扩展Euclid
只不过这道题确实很猥琐……十分容易WA,RE……
Calc函数是借鉴的别人的,我到现在都不明白我的方法为什么会wa……
//Lib #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<ctime> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<queue> using namespace std; //Macro #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i) #define rrep(i,a,b) for(int i=a,tt=b;i>=tt;-- #define erep(i,e,x) for(int i=x;i;i=e[i].next) #define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++) #define read() (strtol(ipos,&ipos,10)) #define sqr(x) ((x)*(x)) #define pb push_back #define PS system("pause"); typedef long long ll; typedef pair<int,int> pii; const int oo=~0U>>1; const double inf=1e20; const double eps=1e-6; string name="",in=".in",out=".out"; //Var ll a,b,c,x1,yy1,x2,y2,ans,x,y,t1,t2,k,kx1,kx2,kyy1,ky2,l,r,m; bool In(ll a,ll b,ll c){return c>=a&&c<=b;} ll ext_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1;y=0; return a; } ll ret=ext_gcd(b,a%b,x,y); ll t=x; x=y;y=t-a/b*x; return ret; } void Calc(ll l,ll r,ll x,ll t,ll &kl,ll &kr) { if(t>0) l=l-x,r=r-x; else { kl=x-r;kr=x-l; l=kl;r=kr; t=-t; } kl=l/t;kr=r/t; if(l>=0&&l%t)kl++; if(r<0&&r%t)kr--; } void Work() { cin>>a>>b>>c;c=-c; cin>>x1>>x2>>yy1>>y2; if(a==0||b==0) { if(a==0&&b==0) {if(c==0)ans=(x2-x1+1)*(y2-yy1+1);} else if(a==0) { if(c%b==0) if(In(yy1,y2,c/b))ans=x2-x1+1; } else if(b==0) { if(c%a==0) if(In(x1,x2,c/a))ans=y2-yy1+1; } cout<<ans<<endl; return; } m=ext_gcd(abs(a),abs(b),x,y); if(a<0)x=-x;if(b<0)y=-y; if(c%m!=0){cout<<0<<endl;return;} x*=c/m;y*=c/m;t1=b/m;t2=a/m; Calc(x1,x2,x,t1,kx1,kx2); Calc(yy1,y2,y,-t2,kyy1,ky2); l=max(kx1,kyy1);r=min(kx2,ky2); if(l<=r)cout<<r-l+1<<endl; else cout<<0<<endl; } int main() { // freopen((name+in).c_str(),"r",stdin); // freopen((name+out).c_str(),"w",stdout); // Init(); Work(); return 0; }