题目描述
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
数据范围限制
对于 30%的数据 t<=10,a,b,c<=100
对于 60%的数据 t<=100,a,b,c<=10^9
对于 100%的数据 t<=10000,a,b,c<=10^14
(我感觉我自己越来越水贴了。。
分析:
这一道题目,我们一看便知(请允许我的冒昧
Beny 吃的量C = 吃X个体积为A的蛋糕+吃Y个体积为B的蛋糕
于是,我们就可以想到 : C = AX+BY
于是,我们就可以推理出: C % (AX+BY) = 0
又是一道很水的Exgcd题目
然后,就没有然后了。。
这里放一下Exgcd函数
long long exgcd(long long a, long long b, long long &x, long long &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
不开long long 回家见mama
但是 ! 还没有完! Exgcd 通常求得都不是(本来就不是
数量总数,所以 我们还需要理解一下这个东西:
因为 y 每一次减去一个a 都能得到一个解
所以,我们直接使用 y / a + 1 即可食用。
(这篇文章充满了水分,-
代码是必须要放到
#include<bits/stdc++.h>
using namespace std;
long long t,a,b,c;
long long exgcd(long long a, long long b, long long &x, long long &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
long long Mod(long long x,long long y)
{
return (x%y+y)%y;
}
int main()
{
scanf("%lld",&t);
while(t--)
{
long long x,y;
scanf("%lld%lld%lld",&a,&b,&c);
long long ap = exgcd(a,b,x,y);
if (c % ap != 0)
{
printf("0\n");
continue;
}
a/=ap;b/=ap;c/=ap;
x=Mod((x%b)*(c%b),b);
y=(c-a*x)/b;
if (y<0)
{
printf("0\n");
}
else
{
printf("%lld\n",y/a+1);
}
}
return 0;
}
总结
(我劝你耗子尾汁,别吃那么多,小心长胖。
终于,Beny吃了10000组蛋糕,每一组小于1e14单位蛋糕
Beny多么幸福啊,肚子都吃没了