• POJ 2891 Strange Way to Express Integers excrt/我真傻,真的


    我真傻,真的

    我单知道这道题在(b-b1)%d!=0时要判无解,哪成想自己却没有读完这组后面的数据而直接break掉。。。qwqfk


     

    $ x equiv b_1 (  mod    a_1  ) $

    $ x equiv b_2   ( mod  a_2 )  $

    ....

    $x  equiv b_n (mod a_n)$

    $a_1,a_2,...,a_n$

    不互质时,正常的中国剩余定理是用不了的

    所以有了EX版

    求解:

    我们先看第1,2个方程,它们可以转化为:

    x=a1*k1+b1, (I)

    x=a2*k2+b2;

    进而a1*k1+b1=a2*k2+b2,所以有:

    a1*k1-a2*k2=b2-b1

    进一步就是 a1*k1+a2*(-k2)=b2-b1  (II)

    把他转化为exgcd求解的形式:ax+by=c,a就是a1,x就是k1,b就是a1,y就是-k2,c就是b2-b1;

    此时可以求出(I)的一组特解,即a1*k1+a2*(-k2)=gcd(a1,a2)时,k1的值。

    显然,当(b2-b1)不能被gcd(a1,a2)整除时,(1)无解;

    若有解,(I)的解就是 k1*(b2-b1)/gcd(a1,a2),

    注意此时算出来k1要mod (a2/gcd(a1,a2)),这相当于是给k1减去了floor(k1/(a2/gcd(a1,a2)))*(a2/gcd(a1,a2)),给k2加上了floor(k1/(a2/gcd(a1,a2)))*(a1/gcd(a1,a2)),防止爆long long;

    然后将k1带回原式,则x=a1*k1+b1

    此时,你得到了满足第1,2两个方程的解,

    那么我们显然又有一个结论:

    最终的ans ≡ x (mod lcm(a1,a2))

    所以我们又有了:
    x≡b12 (mod a12) (*)

    其中b12=第1,2两个方程的解,即上一行的x;a12=lcm(a1,a2)

    那么我们就可以拿(*)和条件中的第3个方程去重复上面的操作。

    一直重复下去,直到解出最终的解

    注:代码中的a相当于a1,a1相当与a2

    #include<cstdio>
    #include<iostream>
    #define ll long long
    #define R register ll
    using namespace std;
    inline ll g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    inline ll exgcd(ll a,ll b,ll& x,ll& y) {
        if(b==0) {x=1,y=0; return a;}
        R d=exgcd(b,a%b,y,x); y-=(a/b)*x; return d;
    }
    int n;
    signed main() {
        while(~scanf("%d",&n)) { register bool flg=false;
            R a=g(),b=g(),k,k1;
            for(R i=2;i<=n;++i) {
                R a1=g(),b1=g(); if(flg) continue;
                R d=exgcd(a,a1,k,k1);
                if((b1-b)%d) flg=true;
                else {
                    k=(b1-b)/d*k%a1;
                    b+=a*k;
                    a=a*a1/d;
                    b%=a;
                }
            } if(flg) printf("-1
    ");
            else printf("%lld
    ",(b%a+a)%a);
        }
    }

    2019.05.15纪念自己的沙雕石刻qwq

  • 相关阅读:
    安装Django、Nginx和uWSGI
    创建Orcale数据库链接访问外部数据库
    ER图,以及转化成关系模式
    eclipse中的Java项目导出成为一个可以直接双击运行的jar文件
    电脑添加新的字体
    JDBC 的编程步骤
    转转基础服务性能压测实战
    公司起诉CTO拖延研发进度,索赔90万
    详解MQ消息队列及四大主流MQ的优缺点
    晒一波程序员的杯子,逼格超级高
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10869382.html
Copyright © 2020-2023  润新知