zoukankan      html  css  js  c++  java
  • 【洛谷P1082】同余方程【扩欧】

    题目大意:

    题目链接:https://www.luogu.org/problem/P1082
    求关于xx的同余方程ax1(modb)ax equiv 1 pmod {b}的最小正整数解。


    思路:

    数论是真的差,现在才来补qwqqwq
    我先把原式改写为等式的形式。
    ax1(modb)ax equiv 1 pmod {b}
    axby=1ax-by=1
    然后设xyx'y'为方程bx(amod  b)y=1bx'-(amod b)y'=1的一组解。
    即为bxy(aab)bx'-y'(a-lfloorfrac{a}{b} floor)的一组解。
    统一格式为
    ayb(xyab)ay'-b(x'-frac{y'a}{b})
    那么代入x=y,y=xyabx=y,y=x'-frac{y'a}{b}即可。
    因为gcd(x,0)=xgcd(x,0)=x,当b=0b=0时,必然有a=1a=1。此时该方程的解为x=1,y=0x=1,y=0
    然后往上回溯求解即可。
    最终我们可以得到该方程的一组解(x,y)(x,y),由于要求xx尽量小且大于0,我们发现为了满足ax+by=1ax+by=1ΔaxDelta ax必然等于ΔbyDelta by,那么同时要满足x,yx,y均为整数,所以需要找到一组合法的(x,y)(x',y')使得a(x±x)=b(y±y)a(x±x')=b(y±y')
    所以ΔaxDelta axΔbyDelta by最小等于lcm(a,b)lcm(a,b)。所以ΔxDelta x每次最小为blcm(a,b)frac{b}{lcm(a,b)}
    那么就让xx不停加减blcm(a,b)frac{b}{lcm(a,b)},知道xx为最小的正整数解为止。其实不断加减就是进行一次取模运算即可。


    代码:

    #include <cstdio>
    #include <algorithm>
    #define mp make_pair
    #define st first
    #define nd second
    using namespace std;
    
    int a,b;
    
    pair<int,int> exgcd(int a,int b)
    {
    	if (b)
    	{
    		pair<int,int> x=exgcd(b,a%b);
    		return mp(x.nd,x.st-x.nd*(a/b));
    	}
    	return mp(1,0);
    }
    
    int main()
    {
    	scanf("%d%d",&a,&b);
    	int x=exgcd(a,b).first,y=b/__gcd(a,b);
    	printf("%d",(x%y+y)%y);
    	return 0;
    } 
    
  • 相关阅读:
    实用图片滑块,传送带,幻灯片效果【附源码】
    Canvas 示例:4种超炫的网站动画背景效果
    GOCR.js – 使用 JS 识别出图片中的文本
    Flexslider
    30款最好的 Bootstrap 3.0 免费主题和模板
    应用 CSS3 动画实现12种风格的通知提示
    Sequence.js 实现带有视差滚动特效的图片滑块
    使用QFuture类监控异步计算的结果
    Qt中的常用容器类(解释比较全面,有插图)
    QMetaEnum获取枚举元信息
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998077.html
Copyright © 2011-2022 走看看