【数论】整理关于ax+by=c

整理关于 \(\rm{ax+by=c}\),遇到的一系列

在这里,\(x\)\(y\) 是变量,\(a,\;b,\;c\) 是常量

前置:

  1. 对于二元一次不定方程 \(ax+by=c\),有整数解的充要条件是 \((a,b)|c\)

  2. \(a=\frac a{gcd(a,b)}\), \(b=\frac b{gcd(a,b)}\)\(c=\frac c{gcd(a,b)}\),则此时 \(gcd(a,b)=1\)

  3. \(gcd(a,b)=1\),且不定方程 \(ax+by=c\) 有整数解 \(x=x_0,\,y=y_0\) ,则它的一切整数解可表示成:

    \[x=x_0+bt\\y=y_0-at\;(t\in \rm Z)
    \]

  4. exgcd可求得 \(ax+by=gcd(a,b)\)的特解,\(x_0,\,y_0\)

  5. 所以 \(ax+by=c\)的特解可表示成 :

    \[x_0=x_0\cdot\frac{c}{gcd(a,b)}=x_0\cdot c\\
    y_0=y_0\cdot\frac{c}{gcd(a,b)}=y_0\cdot c
    \]

  6. \(\rm 3\)可得 \(ax+by=c\) 的通解 \(x,\,y\)


设以下, \(ax+by=c\) 中,均是 \(gcd(a,b)=1\)

1,求 \(\rm{ax+by=c}\), \(x\)的最小正整数解

\(x_1\)\(x\) 的最小正整数解,则 \(x_1\) :

\[x_1=(x\%b+b)\%b\\
对应\;\;y_1=\frac{c-a*x_1}b
\]

2, 求 \(\rm{ax+by}\) 的最大不可解 \(\rm c\),且满足 \(\rm{x>0,y>0}\) : \(\rm{c=a\times b}\)
3, 求 \(\rm{ax+by}\) 的最大不可解 \(\rm c\) , 且满足 \(\rm{x\geq0,y\geq0}\) : \(\rm{c=a\times b-a-b}\)

2,3的证明见洛谷P3951题解

4,求 \(\rm{ax+by+cz=k}\) 的任意一组解,且满足 \(\rm{x\geq0,y\geq0,z\geq0}\) :

其中:\(1\leq a,b,c\leq10^5 ,0\leq k\leq 10^{12}\) ,保证数据有解

\(ax+by=k-cz\) 有解的前提是 \(gcd(a,b)|(k-cz)\),则需枚举z使得满足条件\(gcd(a,b)|(k-cz)\)下,可解的符合的 \(x,\,y\)

​ 设 \(g=gcd(a,b)\) \(ec=k\%g\),则所求的 \(z\) 需满足\(zc-tg=ec\),且 \(z\geq0\)

​ 所以求出最小 \(z\),再枚举满足通项公式的 \(z\),直到有解。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=2e5+5;

ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(!b){
        x=1;y=0;
        return a;
    }
    ll g=exgcd(b,a%b,x,y);
    ll t=x;
    x=y;
    y=t-a/b*y;
    return g;
}

void solve(ll a,ll&b,ll c,ll&x,ll&y)
{
    ll g=__gcd(a,b),x0,y0;
    a/=g;b/=g;c/=g;
    exgcd(a,b,x0,y0);
    x0*=c;y0*=c;
    x=x0+b;//y=y0-a;
    x=(x%abs(b)+abs(b))%abs(b);y=(c-a*x)/b;
}

int main()
{
    ll a,b,c,k,g,ec,x,y,z,t,tb,tk,ttb;
    scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
    g=__gcd(a,b);
    ec=k%g;
    tb=-g;
    solve(c,tb,ec,z,t);
    tb=abs(tb);
    do{
        tk=k-z*c;ttb=b;
        solve(a,ttb,tk,x,y);
        if(x>=0&&y>=0)
        {
            printf("%lld %lld %lld\n",x,y,z);
            break;
        }
        z+=tb;
    }while(1);
}

原文链接: https://www.cnblogs.com/kkkek/p/13637211.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    【数论】整理关于ax+by=c

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/202538

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:11
下一篇 2023年2月12日 下午9:12

相关推荐