牛客练习赛100 A.小红的小桃子(exgcd)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客练习赛100 A.小红的小桃子(exgcd)相关的知识,希望对你有一定的参考价值。

牛客练习赛100 A.小红的小桃子(exgcd)

显然是扩展欧几里得裸题,求最小非负正整数解。

// Problem: 小红的小桃子
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11251/A
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2022-08-10 13:12:13
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

void exgcd(int a,int b,int &x,int &y)
	//ax+by=1
	if(!b)
		x=1,y=0;
		return;
	
	exgcd(b,a%b,y,x); 
	y-=(a/b)*x;

int main()
	int a,b,s;
	cin>>a>>b>>s;
	int g = __gcd(a,b);
	if(s%g)
		return puts("-1"),0;
	
	int x,y;
	exgcd(a,b,x,y);
    x*=(s/g);
	y*=(s/g);
	int u =b/g;
    x=(x%u+u)%u;
    y = (s-a*x)/b;
    if(y < 0) printf("-1\\n");
	else printf("%d %d\\n",x,y);
	return 0;


注意这里需要先 x = x × s g , y = y × s g x=x\\times \\dfracsg,y=y\\times \\dfracsg x=x×gs,y=y×gs 再取模。

不能先取模再乘。

因为此时的 x , y x,y x,y是针对 = g =g =g的解,你先取模,得到其实是 a x + b y = g ax+by=g ax+by=g 关于 x x x的非负解,它的非负解与 a x + b y = s ax+by=s ax+by=s的非负解没有线性关系,因此不能先取模。
而是要先等式同时乘法。

求得 a x + b y = g ax+by=g ax+by=g之后。

等式左右两边同时乘以 s g \\dfracsg gs

a x ′ + b y ′ = s ax'+by'=s ax+by=s

然后 u = b g u=\\dfracbg u=gb

a ( x ′ + b g t ) + b ( y ′ − a g t ) = s a(x'+\\dfracbgt)+b(y'-\\dfracagt)=s a(x+gbt)+b(ygat)=s

因此 x ′ = ( x ′ ( m o d u ) + u ) ( m o d u ) x'= (x'\\pmodu+u)\\pmodu x=(x(modu)+u)(modu) 即可得到 x ′ x' x的最小非负整数解。

以上是关于牛客练习赛100 A.小红的小桃子(exgcd)的主要内容,如果未能解决你的问题,请参考以下文章

牛客练习赛100E.小红的公倍数(线段树+究极卡常

牛客练习赛100E.小红的公倍数(线段树+究极卡常

牛客练习赛100E.小红的公倍数(线段树+究极卡常

牛客小白月赛37部分题解

小红的375(思维+数学)

牛客网Nowcoder 牛客练习赛13 A.幸运数字Ⅰ B.幸运数字Ⅱ(数组或者dfs) C.幸运数字Ⅲ(思维)