【JZOJ A组】吃蛋糕

版权声明:转载者乖乖♂站好 https://blog.csdn.net/Eric1561759334/article/details/82534472

Description

Beny 想要用蛋糕填饱肚子。Beny 一共想吃体积为 c 的蛋糕,他发现有两种蛋糕可以吃,一种体积为 a,一种体积为 b,但两种蛋糕各有特色。Beny 想知道他一共有多少种不同吃法, 使得他恰好可以填饱肚子。

Input

第一行一个 t
接下来 t 行,每行三个正整数 a,b,c

Output

对于每个 a,b,c,输出一个整数表示有几种不同吃法

Sample Input

样例输入 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

Sample Output

样例输出 1
13
0

样例输出 2
6
2
135
3

Data Constraint

对于 30%的数据 t<=10,a,b,c<=100
对于 60%的数据 t<=100,a,b,c<=10^9
对于 100%的数据 t<=10000,a,b,c<=10^14

思路

首先,求ax+by=c的一组解用exgcd即可。但是,这不能保证x>0,y>0。

假设x为最小正整数解,那么答案即为y/(lcm(a,b)/b)

于是,我们可以用取mod的方式把它变为最小值,则y=(c-a*x)/b

注意会炸longlong,优化已经写在代码里了

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll a,b,c;
ll exgcd(ll a,ll b,ll c,ll &x,ll &y)
{
    if(!b)
    {
        x=1; y=0; return a;
    }
    ll e=exgcd(b,a%b,c,x,y);
    ll t=x;x=y;y=t-a/b*y;
    return e;
}
ll count()
{
    ll x=0,y=0,gcd=exgcd(a,b,c,x,y);
    if(c%gcd) return 0;
    ll p=b/gcd;
    x=(c/gcd%p*x%p+p)%p; y=(c-a*x)/b;
    return y<0?0:y/(a/gcd)+1;
}
int main()
{
    freopen("cake.in","r",stdin); freopen("cake.out","w",stdout);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        a=0,b=0,c=0;
        cin>>a>>b>>c;
        cout<<count()<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/Eric1561759334/article/details/82534472