题意:输入a,b,c求a*x+b*y=c,有几组解。。。
第一眼看到这题就知道扩展欧几里得可以做。。。然后就用这个写了。。。。赛后看了下别人的。。。居然暴力就可以。。。
说下扩展欧几里得做法,扩展欧几里得求出一组解(a*x+b*y=gcd(a,b)),gcd(a,b)=d然后判断c能否整除d,不能无解。。有的话x+k*b/d,y-k*a/d(反过来也行),统计下都是正数的个数就行。。
#include
#include
#include
using namespace std;
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(!b)
d=a,x=1,y=0;
else
{
exgcd(b,a%b,d,y,x);
y-=a/b*x;
}
}
int main()
{
int t,a,b,c;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&a,&b,&c);
int d,x,y;
int ans=0;
exgcd(a,b,d,x,y);
if(c%d)
{
printf("0\n");
continue;
}
int k=c/d;
x=x*k;
y=y*k;
int temp;
int x1=x,y1=y;
while(x1-b/d>0)
{
x1-=b/d;
y1+=a/d;
}
while(y1>0)
{
if(x1>0)
ans++;
x1+=b/d;
y1-=a/d;
}
printf("%d\n",ans);
}
return 0;
}