Topic encryption
First of all, we can think of using exgcd when we see this problem, but how to use it? We know that as soon as this equation has a bunch of solutions, then the limit of this problem is the number of solutions. We think that if we simplify the equation, we can get $y=\frac{c}{b}-\frac{a}{b}*x $, and then we will use the knowledge of compulsory education. When a and b are different, they must be the same. If exgcd has solutions, they must be the same. It's an infinite group. It's a direct verdict. If we consider a b's identity sign, then we can get a decreasing straight line that must pass through the first quadrant. We do the following operations on the equation: $a(x-b)+b(y+a)=c $. Obviously, it is also true. At this time, ab can be transformed into a positive sign. If x decreases, then y increases. We can get the maximum solution of Y by moduling x to b, then get the minimum solution of Y by moduling y to a, and then the transformation of y must be a sequence of equal difference numbers. If the tolerance is a, then the range of y can be found and the proposition can be solved.
And then I'll give you A special judgment. Read it and remember to type A minus sign.
#include<iostream> #include<cstdio> #define ll long long using namespace std; ll rd() { ll s=0,w=1; char cc=getchar(); while(cc<'0'||cc>'9') {if(cc=='-') w=-1;cc=getchar();} while(cc>='0'&&cc<='9') s=(s<<3)+(s<<1)+cc-'0',cc=getchar(); return s*w; } ll exgcd(ll a,ll b,ll &x,ll &y,ll c) { if(b==0){x=c/a;y=0;return a;} ll d=exgcd(b,a%b,y,x,c); y-=a/b*x; return d; } int main() { // freopen("data.in","r",stdin); //freopen("data.ans","w",stdout); ll T=rd(),a,b,c,x,y,g,ans; while(T--) { a=rd(),b=rd(),c=rd(); //cout<<a<<" "<<b<<endl; if(!a&&!b) { if(!c)printf("ZenMeZheMeDuo\n"); else printf("0\n"); continue; } if(a<0&&b<0) a=-a,b=-b,c=-c; g=exgcd(a,b,x,y,c); if(c%g){puts("0");continue;} if(a==0) { if((b<=0&&c>=0)||(b>=0&&c<=0))printf("0\n"); else printf("ZenMeZheMeDuo\n"); continue; } if(b==0) { if((a<=0&&c>=0)||(a>=0&&c<=0))printf("0\n"); else printf("ZenMeZheMeDuo\n"); continue; } if(a*b<0) { printf("ZenMeZheMeDuo\n"); continue; } if(a<0&&b<0)a=-a,b=-b,c=-c; a/=g;b/=g;c/=g;x%=b; while(x<=0)x+=b; y=(c-a*x)/b; ll ymin=y%a;while(ymin<=0)ymin+=a; if(ymin>y)ans=0; else ans=(y-ymin)/a+1; if(ans>65535)printf("ZenMeZheMeDuo\n"); else printf("%lld\n",ans); } } /* g++ 6.cpp -o 6 ./6 4 1 -1 3 1 1 65536 1 1 65537 2 3 24 */