裴蜀定理

【ACM数论】裴蜀定理证明 裴蜀定理,又称贝祖定理(Bézout’s lemma)。是一个关于最大公约数的定理。这种递推式转换成矩阵的小技巧就是按照矩阵乘法来的,稍微观察便可以发现!闲来无事,不小心用矩阵巧妙证明了这个定理O(∩_∩)O哈哈~这**不就是斐蜀定理吗?是不全为零的整数,则存在整数。那么如何证明这个定理喃?)写成矩阵的形式,如下。 阅读详情

裴蜀定理:

对于任意的正整数a,b,都存在整数s,t,使a*s+b*t=gcd(a,b)

拓展欧几里得算法:

由裴蜀定理可写一个算法exgcd,去求得s,t的一组解

但首先我们要先知道gcd(a,b)=gcd(b,a%b)

又因为gcd(a,b)=a*s+b*t;gcd(b,a%b)=b*{s}'+(a%b)*{t}'

且a%b=a-\left [ \frac{a}{b} \right ]*b

所以a*s+b*t=b*{s}'+(a-\left [ \frac{a}{b} \right ]*b)*{t}'

整理可得a*s+b*t=a* {t}'+b*({s}'-\left [ \frac{a}{b} \right ]*{t}')

所以当s={t}',t= {s}'-\left [ \frac{a}{b} \right ]*t时,等式成立

到最后, a*s+b*t=gcd(a,0),此时令s=1,t=0即可得出一组特解

代码实现如下
 

int exgcd(int a,int b,&s,&t){
	if(!b){
		s=1;
		t=0;
		return a;
	}
	int gcd=exgcd(b,a%b,s,t);
	int x=s;
	s=t;
	t=x-a/b*t;
	return gcd;
} 

 应用:

对于实际问题中,我们常常遇到解一元二次方程的问题,形如a*x+b*y=c

根据裴蜀定理,我们知道a*s+b*t=gcd(a,b),一定有解,且若a*s+b*t=c有解,那一定有c=k*gcd(a,b)

即c是gcd(a,b)的倍数

那么我们令s=x,t=y,利用exgcd求得x,y的一组解后,并让x,y分别扩大k倍,就得到了a*x+b*y=c的一组特解x_{0},y_{0}

我们知道x的所有解的集合满足{ x|x_{0}+n*\frac{b}{gcd(a,b)}},y满足{y|y_{0}+n*\frac{a}{gcd(a,b)}}

由此可得x,y的任意一组解

例题:

The Balance

 Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspirin using 300mg weights and 700mg weights, she can put one 700mg weight on the side of the medicine and three 300mg weights on the opposite side (Figure 1). Although she could put four 300mg weights on the medicine side and two 700mg weights on the other (Figure 2), she would not choose this solution because it is less convenient to use more weights.
You are asked to help her by calculating how many weights are required.

Input:

The input is a sequence of datasets. A dataset is a line containing three positive integers a, b, and d separated by a space. The following relations hold: a != b, a <= 10000, b <= 10000, and d <= 50000. You may assume that it is possible to measure d mg using a combination of a mg and b mg weights. In other words, you need not consider "no solution" cases.
The end of the input is indicated by a line containing three zeros separated by a space. It is not a dataset.

Output:

The output should be composed of lines, each corresponding to an input dataset (a, b, d). An output line should contain two nonnegative integers x and y separated by a space. They should satisfy the following three conditions.

  • You can measure dmg using x many amg weights and y many bmg weights.
  • The total number of weights (x + y) is the smallest among those pairs of nonnegative integers satisfying the previous condition.
  • The total mass of weights (ax + by) is the smallest among those pairs of nonnegative integers satisfying the previous two conditions.


No extra characters (e.g. extra spaces) should appear in the output.

Sample

InputcopyOutputcopy
700 300 200
500 200 300
500 200 500
275 110 330
275 110 385
648 375 4002
3 1 10000
0 0 0
1 3
1 1
1 0
0 3
1 1
49 74
3333 1

 代码如下:

#include<iostream>
#include<algorithm>
#define ll long long 
using namespace std;
ll a,b;
ll n,d,x,y;
ll ans1,ans2;
ll exgcd(ll a, ll b, ll &ax, ll &ay) {
	if(!b) {
		ax = 1;
		ay = 0;
		return a;
	}
	ll ans = exgcd(b, a%b, ax, ay);
	ll f = ax;
	ax = ay;
	ay = f-a/ b*ay;
	return ans;
}

int main () {
	while(cin>>a>>b>>d){
		if(a==0&&b==0&&d==0)return 0; 
		ll MIN=1e18;
		ll MINN=1e18;
		ll k=exgcd(a,b,x,y);
		x*=(d/k);
		y*=(d/k);
		ll q=b/k;
		ll p=a/k;
		ll xa=((x%q)+q)%q;
		ll ya=(d-(a*xa))/b;
		ll yb=((y%p)+p)%p;
		ll xb=(d-(b*yb))/a;
		for(int i=-10000;i<=10000;i++){
			ll x1=abs(xa+(i*b)/k);
			ll y1=abs(ya-(i*a)/k);
			ll x2=abs(xb+(i*b)/k);
			ll y2=abs(yb-(i*a)/k);
			if(x1+y1<MIN||(x1+y1==MIN&&(a*x1)+(b*y1)<=MINN)){
				ans1=x1,ans2=y1;
				MIN=x1+y1,MINN=(a*x1)+(b*y1);
			}
			if(x2+y2<MIN||(x2+y2==MIN&&(a*x2)+(b*y2)<=MINN)){
				ans1=x2,ans2=y2;
				MIN=x2+y2,MINN=(a*x2)+(b*y2);
			}
		} 
		printf("%lld %lld\n",ans1,ans2);
	}
}

 说实话这个做法比较麻烦

解法2:

#include<iostream>
#include<algorithm>
#define LL long long
#define MAX 5
#define INF 0x3f3f3f3f
using namespace std;
int exgcd(int a,int b,int &x,int &y){
    if(b == 0){
        x = 1;
        y = 0;
        return a;
    }
    int ans = exgcd(b,a%b,x,y);
    int temp = y;
    y = x - (a/b)*y;
    x = temp;
    return ans;
}
 
int gcd(int a, int b){
    if(b == 0) return a;
    return gcd(b, a%b);
}
 
int main(){
    int a,b,d;
    while(cin >> a >> b >> d){
        if(!a && !b && !d) break;
        int x,y;
        int m = gcd(a,b);
        int flag = 0;
        if(a < b){  // 确保a > b
            flag = 1;
            swap(a,b);
        }
        exgcd(a,b,x,y);
        x = x*d/m;
        y = y*d/m;  // 对解进行转化,扩展欧几里德算法是默认解的翡蜀方程
        int t = (y*m)/a;  
        int ans = INF;
        int x1,x2,y1,y2;
        for(int i = t-5;i <= t+5;i++){ 
            x1 = x + (b*i)/m;
            y1 = y - (a*i)/m;
            if(abs(x1) + abs(y1) < ans){
                x2 = x1;
                y2 = y1;
                ans = abs(x1) + abs(y1);
            }
        }
        if(flag == 0){
            cout << abs(x2) << " " << abs(y2) << endl;
        }else{
            cout << abs(y2) << " " << abs(x2) << endl;
        }
    }
}

Sigrity Power Tree如何进行直流压降仿真分析操作指导 Sigrity Power Tree模式可以用于前仿真,在没有layout文件的情况下对电源进行直流压降仿真分析,用于评估原理图设计以及器件选型是否合理。Model:设置为Equal Current,设置为等电源模型,意思该负载每个电源pin都是等电流的。Current:设置每个负载的电流,U30为3A,U3-U6各为1A。Nominal Current:设置能够承载的最大电流,设置为10A。Upper/ Lower Tol:设置为压降范围为5%Output Current:设置输出电流为10A。 阅读详情

相关推荐

从FP16到FP8:我是如何让Stable Diffusion 3.5提速40%而不丢画质的

本文分享了StableDiffusion模型优化的实战经验。通过FP8精度转换、分层处理敏感模块,实现显存占用降低35%、推理速度提升40%。文章详细介绍了提升画质的五大技巧、本地/云端/移动端部署方案,以及二次元模型定制等垂直领域应用。同时总结了硬件兼容性、数据质量等七大常见陷阱,并强调持续监控和伦理考量。作者指出未来应关注MoE架构、注意力机制优化等方向,认为技术优化是持续追求性能与质量平衡的过程。

达则兼济天下 1187

【数论系列】 裴蜀定理(贝祖定理)

「裴蜀定理」,又称贝祖定理(Bézout's lemma)。是一个关于最大公约数的定理。其内容定义为:对于不全为零的任意整数 a 和 b,记二者的最大公约数为 g 即 gcd(a,b) = g,则对于任意整数x和y都一定满足 ax+by 是 g 的倍数...

这里是阿安的博客 7769

蓝牙Mesh安全机制全解析:如何防止你的智能门锁被黑客控制?

本文深入解析蓝牙Mesh安全机制,重点探讨如何保护智能门锁免受黑客攻击。详细介绍了蓝牙Mesh的多层次安全架构,包括密钥管理体系、设备入网流程及实战防护策略,帮助用户构建更安全的智能家居网络。

h3i4j的博客 731

【数学】裴蜀定理

裴蜀定理

Runcode8的博客 2233

非华为电脑也能用!华为电脑管家完美安装教程来了

GitHub 上有一个开源项目 ​****​,专门解决“非华为设备无法安装华为电脑管家”的问题。它通过智能模拟 + DLL 劫持技术,绕过官方对硬件型号的检测,让你在联想、戴尔、华硕甚至 DIY 主机上也能流畅使用华为电脑管家!⭐ 项目已获 ​700+ Stars​,社区活跃,持续更新,兼容性优秀!科技不该有围墙。如果你成功在非华为电脑上跑起了 PCManager,欢迎在评论区晒出你的设备型号 + 使用体验!也别忘了把这篇推文分享给同样“眼馋”华为生态的朋友 ~📱 ​关注我们。

程序员朱永胜 4927

S32DS 3.5.8离线包怎么用?保姆级教程教你手动安装S32K3开发环境(附资源下载)

本文详细介绍了S32DS 3.5.8离线包的安装方法,适用于S32K3开发环境的手动搭建。从资源获取、完整性验证到分步安装指南,提供了全面的离线部署解决方案,特别适合军工/车企内网开发等场景。文章还包含版本选择建议、常见问题排查及团队协作方案,帮助开发者高效完成环境配置。

weixin_30471561的博客 477

裴蜀定理详解

在数论中,裴蜀定理是一个关于最大公约数或者最大公约式的定理。 简介 裴蜀定理(或贝祖定理,Bézout's identity)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约 数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使a

yeweiyang的博客 1万+

VC Spyglass CDC实战:从TCL脚本到SDC约束的完整避坑指南

本文是一份针对数字IC验证工程师的VC Spyglass CDC实战指南。文章详细阐述了从TCL脚本环境搭建、SDC约束编写到典型CDC违规(如SETUP_PORT_UNCONSTRAINED)诊断与修复的完整流程,旨在帮助读者高效避坑,深入理解工具逻辑,从而完成可靠的时钟域交叉验证。

go5gopher的博客 383

算法学习系列(二十九):裴蜀定理、扩展欧几里得算法

这个扩展欧几里得算法用的还是比较多的,而且也很实用,话不多说直接开始吧。

weixin_60033897的博客 2354

微信小程序|基于小程序+云开发制作一个租房小程序

经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 4929

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds.

在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多`

“Allen Su”的博客 2238

裴蜀定理 【浅讲】

这里证明不会讲解,因为写这篇文章的目的是为了让大家简单理解裴蜀定理。 以及可以在算法题中可以运用。主要针对于做题。 裴蜀定理(又称贝祖定理) 特殊性: 对于方程ax+by=1只有整数a和b互质时,方程才有整数解。 裴蜀定理的证明视频 裴蜀定理的证明文章 扩展欧几里德算法是用来在已知a , b 求解一组x , y ,使它们满足裴蜀(贝祖)等式: a x + b y = gcd ⁡ ( a , b ) = d 扩展欧几里得算法——exgcd 877. 扩展欧几里得算法 https://www.a.

辉小歌的博客 3216

QGis二次开发 —— 5.1、基于qgis开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

基于qgis开发雷达扫描、无人机飞行跟踪等

325

裴蜀定理详细介绍

裴蜀定理对于两个整数 ( a ) 和 ( b ),它们的最大公约数 ( d ) 可以表示成 ( a ) 和 ( b ) 的线性组合。也就是说,一定存在整数 ( x ) 和 ( y ),使得axbydaxbyd假设 ( a = 15 ) 和 ( b = 10 )。它们的最大公约数是 5,也就是 ( gcd(15, 10) = 5 )。

HYY的博客 2568

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

裴蜀定理与乘法逆元

转载请说明出处:http://blog.youkuaiyun.com/leader_one/article/details/75298966说在前面出于尊重,还是先简介一下裴蜀:。。。。。。好吧,网上并没有什么关于 艾蒂安·裴蜀 的个人简介。 为什么把裴蜀定理和乘法逆元放在一起讲呢? 因为二者之间有非常微妙的关系,裴蜀定理说明了两数不互质(a,m不互质)的情况下,a是没有关于m的乘法逆元的(a*x ≡ 1 m

leader_one的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

裴蜀定理(贝祖定理)

在介绍裴蜀定理前,我们先看一个比较经典的问题: 有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。 你允许: 装满任意一个水壶 清空任意一个水壶 从一个水壶向另外一个水壶倒水,直到装满或者倒空 示例 1: 输入: x = 3, y = 5, z = 4 输出: Tr...

upc_miao的博客 3818

裴蜀定理——详解

裴蜀定理,又称贝祖定理(Bézout's lemma)、贝祖等式(Bézout's identity)。是一个关于最大公约数的定理。其内容是:设 是不全为零的整数,对任意整数 ,满足 ,且存在整数 , 使得 .

w_w_wwwww的博客 1394

裴蜀定理应用

对于不全为0的整数ab,一定存在整数xy,满足axbygcdab对于不全为0的整数a,b,一定存在整数x,y,满足ax+by=gcd(a,b)对于不全为0的整数ab,一定存在整数xy,满足axbygcdab就比如2x6y82x+6y=82x6y8就有解,比如x1y1或者x4y0x=1,y=1或者x=4,y=0x1y1或者x4y0而2x6y12x+6y=12x6。

2303_76472344的博客 1420

裴蜀定理基本介绍

题目传送门 裴蜀定理也叫做(贝祖定理) 定理内容:如果方程 ax + by == c,如果x,y的解为整数,那么c一定是gcd(a,b)的倍数。//gcd(a,b)为a,b的最大公约数 博主的粗略证明(不知道对不对哈。。。。) 当x,y都等于1的时候: a%gcd(a,b) == 0,b%gcd(a,b) == 0.那么(a+b)%gcd(a,b) == 0,而c == a+b; 当x,y任意取时...

give it a try 2420

P4549 【模板】裴蜀定理 题解

P4549 【模板】裴蜀定理 题解

yaosichengalpha的博客 1137

关于裴蜀定理的一些证明

裴蜀定理: 对任何a,b∈Za,b \in Z和它们的最大公约数dd,关于未知数xx和yy的线性不定方程(称为裴蜀等式):ax+by=cax+by=c有整数解(x,y)(x,y)当且仅当d∣cd \mid c,可知有无穷多解。特别地,一定存在整数x,yx,y,使ax+by=dax+by=d成立。 推论: a,ba,b互质的充要条件是存在整数x,yx,y使ax+by=1ax+by=1对于(a,b

弱智就要多努力 1万+

浅谈裴蜀定理

本文介绍裴蜀定理以及在 OI 中的用处。

m0_66248056的博客 977

P4549 【模板】裴蜀定理

取负数,两数之积就为正了,所以不用考虑判断。,我们其实可以默认它们全部为。接着,我们其实需要计算的就是。,是可以取任意值的,所以当。所以,最后的答案就是所有。(不全为零),存在整数。

STY_fish_2012的博客 981

裴蜀定理及证明

在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):   ax + by = m   有解当且仅当m是d的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用辗转相除法求得。   例如,12和42的最大公因子是6,则方程12x +

acm_1361677193的专栏 8468
上一篇: 第K大的数
下一篇: 同余&欧拉函数
PocketSam
博客等级 码龄4年 24粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值