牛客练习赛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(y′−gat)=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)的主要内容,如果未能解决你的问题,请参考以下文章