题目描述
Beny 想要用蛋糕填饱肚子。Beny 一共想吃体积为 c 的蛋糕,他发现有两种蛋糕可以吃,一种体积为 a,一种体积为 b,但两种蛋糕各有特色。Beny 想知道他一共有多少种不同吃法, 使得他恰好可以填饱肚子。
输入
t第一行一个 t
接下来 t 行,每行三个正整数 a,b,c。
输出
对于每个 a,b,c,输出一个整数表示有几种不同吃法。
样例输入
样例输入1 3 2 3 4 3 4 24 3 7 11 样例输入2 4 12 13 1003 56 44 792 4616 5364 836482148 3836501 7035978 77151863500136
样例输出
样例输出 1 1 3 0 样例输出 2 6 2 135 3
思路
我们假设Beny吃x块a蛋糕,y块b蛋糕,则得出式子ax+by=c(a,b,c已知)
这便是一道扩展欧几里得。我们先设g表示gcd(a,b),先判断c 能否整除g,若不,直接输出0。再用a,b,c分别除以c,再分别算出x和y。若y<0,直接输出0,否则输出。
具体代码
#include<cstdio>
using namespace std;
long long t,a,b,c,k,g,g1,x,y;
long long exgcd(long long a,long long b)
{
if (b==0)
{
x=1;y=0;
return a;
}
else
{
long long t1=exgcd(b,a%b);
long long xx=x;
x=y;
y=xx-a/b*y;
return t1;
}
}
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld",&a,&b,&c);
g=exgcd(a,b);
if (c%g!=0)
{
printf("0\n");
continue;
}
long long cc,xx=x;
a/=g;b/=g;c/=g;
x=(((x%b)*(c%b))%b+b)%b;
y=(c-a*x)/b;
if (y<0)
{
printf("0\n");
}
else
{
printf("%lld\n",y/a+1);
}
}
return 0;
}