#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector> using namespace std; #define ll long long // 题目:给定三种物品的价格A,B,C和拥有的钱P(C / gcd(A, B, C) >= 200)
// 求解 AX + BY + CZ = P的解个数(case = 100)
// A, B, C, P ∈ [0, 100000000] // 解:
// AX + BY = P - CZ (C >= 200 -> Z <= 1e8 / 200 = 5e5)
// 复杂度O(case * 5e5 * log(1e8)) const int INF = 1e9;
const ll MOD = ;
ll a, b, c, p, x, y, gcd_ab; ll exgcd(ll a, ll b, ll &x, ll &y)
{ if(b == ){//推理1,终止条件
x = ;
y = ;
return a;
}
ll r = exgcd(b, a%b, x, y);
//先得到更底层的x2,y2,再根据计算好的x2,y2计算x1,y1。
//推理2,递推关系
ll t = y;
y = x - (a/b) * y;
x = t;
return r;
} ll fun(ll n)
{
if(n % gcd_ab) return ;
ll tim = n / gcd_ab;
ll xx, yy;
// a * (tim * x) + b * (tim * y) = gcd(a, b) * tim = n;
xx = x * tim;
yy = y * tim;
ll k, k1, k2;
//a * (xx + F) + b * (yy + G) = n
// Fa + Gb = 0
// F = lcm(a, b) / a * t
// G = lcm(a, b) / g * t
k1 = b / gcd_ab;
k2 = a / gcd_ab; if(xx < ){
k = -(xx / k1) + (xx % k1 != );
xx += k * k1; yy -= k * k2;
}
if(yy < ){
k = -(yy / k2) + (yy % k2 != );
xx -= k * k1; yy += k * k2;
} //cout << "aa = " << aa << " bb = " << bb << endl;
ll x1, x2, y1, y2;
if(xx < || yy < ) return ;
k = xx / k1;
xx -= k * k1;
yy += k * k2;
x1 = xx, y1 = yy;
k = yy / k2;
xx += k * k1;
yy -= k * k2;
x2 = xx, y2 = yy;
y2 = y2 - k * k2;
//x1 + (x2 - x1) / k1 = x2
return (x2 - x1) / k1 + ;
} void solve()
{ int T, _case = ;
cin >> T;
while(T--){ cin >> a >> b >> c >> p;
//ax + by = gcd(a, b)
gcd_ab = exgcd(a, b, x, y);
//cout << x << " " << y << endl;
ll ways = ;
for(ll i = ; p - c * i >= ; ++i){
ways += fun(p - c * i);
//cout << "ways = " << ways << endl;
} cout << "Case " << ++_case << ": " << ways << endl;
}
} int main()
{ solve(); //cout << "ok" << endl; return ;
}

拓展欧几里得求 ax + by = c的通解(a >=0, b >= 0)的更多相关文章

  1. gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)

    gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...

  2. Modular Inverse (拓展欧几里得求逆元)

    The modular modular multiplicative inverse of an integer a modulo m is an integer xsuch that a-1≡x ( ...

  3. 扩展欧几里得 求ax+by == n的非负整数解个数

    求解形如ax+by == n (a,b已知)的方程的非负整数解个数时,需要用到扩展欧几里得定理,先求出最小的x的值,然后通过处理剩下的区间长度即可得到答案. 放出模板: ll gcd(ll a, ll ...

  4. POJ 1061 青蛙的约会(拓展欧几里得求同余方程,解ax+by=c)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 122871   Accepted: 26147 Descript ...

  5. ZOJ 3593 One Person Game(拓展欧几里得求最小步数)

    One Person Game Time Limit: 2 Seconds      Memory Limit: 65536 KB There is an interesting and simple ...

  6. ZOJ 3609 Modular Inverse(拓展欧几里得求最小逆元)

    Modular Inverse Time Limit: 2 Seconds      Memory Limit: 65536 KB The modular modular multiplicative ...

  7. POJ 2891 Strange Way to Express Integers(拓展欧几里得)

    Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...

  8. Looooops(求解同余方程、同余方程用法)【拓展欧几里得】

    Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...

  9. 青蛙的约会 (ax+by=c求最小整数解)【拓展欧几里得】

                                                  青蛙的约会(点击跳转) 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住 ...

随机推荐

  1. 基于svg的环形进度条

    其实需求是这么一个基于日期的环形进度条,开始用css3写了一下感觉太麻烦了,于是抽了点时间用svg画了一个. 不多说 上代码: css: <style> circle { -webkit- ...

  2. SpingBoot整合jxls2.0-excel导出—— 列表循环,自定义方法,超链接等

    Java中实现excel导出数据的方法有很多,一般简单的可以通过操作POI进行,但是复杂的excel格式导出如果用POI就显得非常麻烦,本文介绍的jxls2.0完全依据模板进行导出,只需要进行简单的配 ...

  3. mdk/iar汇编区别

    在代码移植中,经常遇到iar的代码转换问题,在此不间断记录一些,个人感觉还是IAR的更接近C一些,备查: 1. #ifdef的使用 // IAR #ifdef MACRO_XX #endif // M ...

  4. 「从零单排canal 05」 server模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  5. .Net、ASP.Net、C#、VisualStudio之间的关系是什么

    .Net一般指的是.NetFramework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调 用,.NetFramework还提供了 CLR.JIT.GC等基础功能. ASP.Net是 ...

  6. socket链接

    服务端: package com.batch.service.impl; import java.io.BufferedReader; import java.io.BufferedWriter; i ...

  7. JS常用知识点(一)

    1.js数据类型 基本类型:String.Number.boolean.null.undefined.Symbol 引用类型:Object null和undefined的区别:undefined表示定 ...

  8. Monster Audio 使用教程 (六) 发送音轨的设置

    因为最近有些用户,不太清楚怎么发送给混响音轨,所以这里我简单介绍一下. Monster Audio的音轨,主要分为两种类型: 1.白色推子:表示普通音轨 2.蓝色推子:表示“可接收发送音轨”,其他音轨 ...

  9. css的一些小技巧。修改input样式

    在第一次正式写项目的时候,遇到了几个布局的小技巧.记录一下. 我们常常会遇到图片和文字对齐的一种样式.比如 这样的样式,我们写的时候有时候会出现不对齐的情况.我们有俩种方法 一种就是flex的布局,还 ...

  10. Asp.NetCore3.1 WebApi 使用Jwt 授权认证使用

    1:导入NuGet包 Microsoft.AspNetCore.Authentication.JwtBearer 2:配置 jwt相关信息 3:在 startUp中 public void Confi ...