lightoj1306 细节+exgcd+待补

题意很好解...

直接exgcd  求最小值,然后对于xa----xb区间......求一波x多少可以满足

然后y同理,然后取一波最小值...

就搞定了...

不知道为什么莫名RE

#include<bits/stdc++.h>
using namespace std;

int T,cishu;
long long a,b,c,xa,ya,xb,yb,x,y,gcd,minlx,minly,maxlx,maxly,dx,dy,ans1,ans2;

long long exgcd(long long al,long long bl,long long &xl,long long &yl){
    if(bl==0){
        xl=1,yl=0;
        return al;
    }
    long long zz = exgcd(bl,al%bl,xl,yl);
    xl-=(al/bl)*yl;
    swap(xl,yl);
    return zz;
}

int main(){
    cin>>T;
    while(T--){
        cishu++;cout<<"Case "<<cishu<<": ";
        cin>>a>>b>>c>>xa>>xb>>ya>>yb;
        if(a==0&&b==0){
            if(c==0)cout<<(xb-xa+1)*(yb-ya+1)<<endl;
            else cout<<0<<endl;
            continue;
        }
        
        gcd = exgcd(a,b,x,y);
        if(abs(c)%abs(gcd)!=0){cout<<0<<endl;continue;}
        x=x*c/(gcd),y=y*c/(gcd),dx=abs(b/gcd),dy=abs(a/gcd);
        minlx = (x%dx+dx)%dx,minly = (y%dy+dy)%dy;
        ans1=((xb-xa)-minlx)/dx;
        ans2=((yb-ya)-minly)/dy;
        if(((xb-xa)-minlx)%dx==0)ans1++;
        if(((yb-ya)-minly)%dy==0)ans2++;
        cout<<min(ans1,ans2)<<endl;
    }
}
View Code

好像是正负号?

猜你喜欢

转载自www.cnblogs.com/shatianming/p/12347763.html