zoukankan      html  css  js  c++  java
  • [扩欧]JZOJ 5855 吃蛋糕

    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我们可以用扩欧来做

    如果要求最小解,y=y/(lcm(a,b)/b)

    然后取模则为y=(c-a*x)/b

    然后一波快速乘优化就行

    #include <iostream>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    
    ll Exgcd(ll a,ll b,ll &x,ll &y) {
        if (!b) {
            x=1;y=0;
            return a;
        }
        ll gcd=Exgcd(b,a%b,y,x);
        y-=a/b*x;
        return gcd;
    }
    
    ll Solve(ll a,ll b,ll c) {
        ll x,y,gcd=Exgcd(a,b,x,y);
        if (c%gcd) return 0;
        ll q=b/gcd;
        x=(c/gcd%q*x%q+q)%q;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--) {
            ll a,b,c;
            scanf("%lld%lld%lld",&a,&b,&c);
            printf("%lld
    ",Solve(a,b,c));
        }
        fclose(stdin);fclose(stdout);
    }
    View Code
    在日渐沉没的世界里,我发现了你。
  • 相关阅读:
    python2.7实现websocket服务器,可以在web实时显示远程服务器日志
    web请求的处理流程
    实现简单的django上传文件
    rsync+sersync实现数据文件实时同步
    WebSphere之wasprofile.sh使用
    WebSphere性能优化的几个方法
    WebSphere配置数据库连接池
    正则表达式(Regular Expression)
    FFT Golang 实现
    http://phantomjs.org/page-automation.html
  • 原文地址:https://www.cnblogs.com/mastervan/p/9642925.html
Copyright © 2011-2022 走看看