细节巨多的数学题。首先解出一组x最小的正整数解->ymax,同理求出ymin。就求出了解的个数。
那么我来说说巨多的细节。
1,解不出一组解来。
2,a=0||b=0时,若另一个变量最小解小于零,无解;若能解出,就有无数组。
3,a,b异号。
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
#define ll long long
using namespace std;
int t;
inline void exgcd(ll a,ll b,ll c,ll &x,ll &y,ll &g)
{
if(!b){g=a;y=0;x=c/a;}
else {exgcd(b,a%b,c,y,x,g);y-=(a/b)*x;}
}
inline void hh()
{
ll a,b,c,x,y,sum,g;bool aa=0,bb=0;
scanf("%lld%lld%lld",&a,&b,&c);
if(!a&&!b)
{
if(!c)printf("ZenMeZheMeDuo\n");
else printf("0\n");
return;
}
if(c<0)a=-a,b=-b,c=-c;
if(a<0)a=-a,aa=1;
if(b<0)b=-b,bb=1;
exgcd(a,b,c,x,y,g);
if(a*x+b*y!=c){printf("0\n");return;}
if(aa)x=-x,a=-a;
if(bb)y=-y,b=-b;
if(a==0)
{
if(y<=0)printf("0\n");
else printf("ZenMeZheMeDuo\n");
return;
}
if(b==0)
{
if(x<=0)printf("0\n");
else printf("ZenMeZheMeDuo\n");
return;
}
if((a<0&&b>0)||(a>0&&b<0))
{
printf("ZenMeZheMeDuo\n");
return;
}
if(a<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 y1=y%a;
while(y1<=0)y1+=a;
int ans;
if(y1>y)ans=0;
else ans=(y-y1)/a+1;
if(ans>65535)printf("ZenMeZheMeDuo\n");
else printf("%d\n",ans);
}
int main()
{
//freopen("fuction.in","r",stdin);
//freopen("fuction.out","w",stdout);
cin>>t;
while(t--)hh();
}