• 牛客练习赛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
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    注意这里需要先 x = x × s g , y = y × s g x=x\times \dfrac{s}{g},y=y\times \dfrac{s}{g} 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 \dfrac{s}{g} gs

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

    然后 u = b g u=\dfrac{b}{g} u=gb

    a ( x ′ + b g t ) + b ( y ′ − a g t ) = s a(x'+\dfrac{b}{g}t)+b(y'-\dfrac{a}{g}t)=s a(x+gbt)+b(ygat)=s

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

  • 相关阅读:
    solidity笔记
    架构分析:「转转云平台」的 Kubernetes 实践
    华为配置直连三层组网直接转发示例
    C++ 性能优化指南 KurtGuntheroth 第5章 优化算法 摘录
    Maestro实践
    Redis缓存设计与性能优化
    【Qt】解决 “由于找不到Qt5Cored.dll,无法继续执行代码”(亲测有效)
    (2022版)一套教程搞定k8s安装到实战 | Volumes
    发布自定义node包,实现自定义脚本命令
    uni-app - 左右垂直分类列表(类似商城商品分类,左侧菜单右侧列表内容)
  • 原文地址:https://blog.csdn.net/weixin_45750972/article/details/126283549