拓展欧几里得求 ax + by = c的通解(a >=0, b >= 0)
#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)的更多相关文章
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...
- Modular Inverse (拓展欧几里得求逆元)
The modular modular multiplicative inverse of an integer a modulo m is an integer xsuch that a-1≡x ( ...
- 扩展欧几里得 求ax+by == n的非负整数解个数
求解形如ax+by == n (a,b已知)的方程的非负整数解个数时,需要用到扩展欧几里得定理,先求出最小的x的值,然后通过处理剩下的区间长度即可得到答案. 放出模板: ll gcd(ll a, ll ...
- POJ 1061 青蛙的约会(拓展欧几里得求同余方程,解ax+by=c)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 122871 Accepted: 26147 Descript ...
- ZOJ 3593 One Person Game(拓展欧几里得求最小步数)
One Person Game Time Limit: 2 Seconds Memory Limit: 65536 KB There is an interesting and simple ...
- ZOJ 3609 Modular Inverse(拓展欧几里得求最小逆元)
Modular Inverse Time Limit: 2 Seconds Memory Limit: 65536 KB The modular modular multiplicative ...
- POJ 2891 Strange Way to Express Integers(拓展欧几里得)
Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...
- Looooops(求解同余方程、同余方程用法)【拓展欧几里得】
Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...
- 青蛙的约会 (ax+by=c求最小整数解)【拓展欧几里得】
青蛙的约会(点击跳转) 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住 ...
随机推荐
- POJ 1046 Color Me Less 最详细的解题报告
题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ M ...
- Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件
Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件 前言 公司有购买的监控软件北塔系统监控,由于购买的版权中只包含了有限台数据库服务器的监控,所以只监控了比较重要的几台服务器. 后边 ...
- jquery文件表单上传
1. 引入jquery文件 <script src="js/jquery-2.1.1.min.js"></script> 2. 创建form表单,如下: ...
- Ethical Hacking - Web Penetration Testing(6)
REMOTE FILE INCLUSION Similar to local file inclusion. But allows an attacker to read ANY file from ...
- 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)
一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...
- 一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗
一:背景 1. 讲故事 最近因为各方面原因换了一份工作,去了一家主营物联柜的公司,有意思的是物联柜上的终端是用 wpf 写的,代码也算是年久失修,感觉技术债还是蛮重的,前几天在调试一个bug的时候,看 ...
- Nginx配置多个域名指向不同的端口
一.前言 很多时候我们都会在同一个服务器上部署多个项目,我们有多个域名的情况下,怎么样使不同的域名都通过80端口来访问呢?打个比方说,现在有2个域名,分别是:tessai.cn 和 admin.tes ...
- Django序列化组件Serializers详解
本文主要系统性的讲解django rest framwork 序列化组件的使用,基本看完可以解决工作中序列化90%的问题,写作参考官方文档https://www.django-rest-framewo ...
- redis,rabbitmq,SqlAlchemy
redis发布和订阅
- Bug--Mybatis报错:There is no getter for property named 'id' in 'class java.lang.Integer'
Mybatis 添加@Param("")注释就可以了