zoukankan      html  css  js  c++  java
  • [洛谷P1495] 曹冲养猪 (中国剩余定理模板)

    中国剩余定理(朴素的)用来解线性同余方程组:

    x≡a[1] (mod m[1])

    x≡a[2] (mod m[2])

    ......

    x≡a[n] (mod m[n])

    定义ms=m[1]*m[2]*......*m[n] ,mm[i]=ms/m[i] ,inv[i]为mm[i]在模m[i]意义下的逆元。

    则:x=mm[1]*inv[1]*a[1] + mm[2]*inv[2]*a[2] + ...... + mm[n]*inv[n]*a[n]

    这种朴素的CRT只适用于所有的m[i]两两互质。

    虽然说是复习,但是之前学的貌似全忘干净了,感觉像重学了一遍。

    给一道裸题:洛谷 P1495 曹冲养猪

    上代码。

     1 #include<cstdio>
     2 #define ll long long
     3 
     4 int n;
     5 ll ans;
     6 ll m[15],a[15],ms=1;
     7 
     8 void exgcd(ll aa,ll bb,ll &x,ll &y)
     9 {
    10     if(!bb)
    11     {
    12         x=1,y=0;
    13         return;
    14     }
    15     exgcd(bb,aa%bb,y,x);
    16     y-=(aa/bb)*x;
    17 }
    18 
    19 int main()
    20 {
    21     scanf("%d",&n);
    22     for(int i=1;i<=n;i++)scanf("%lld%lld",&m[i],&a[i]),ms*=m[i];
    23     for(int i=1;i<=n;i++)
    24     {
    25         ll mm=ms/m[i];
    26         ll inv,yy;
    27         exgcd(mm,m[i],inv,yy);
    28         ans=(ans+mm*inv*a[i])%ms;
    29     }
    30     printf("%lld",(ans%ms+ms)%ms);
    31     return 0;
    32 }
  • 相关阅读:
    java微信扫码支付(模式二)
    Python学习08
    学习java第12天
    学习java第11天
    学习java第十天
    学习Java第九天
    学习Java第八天
    学习Java第六天
    学习Java第六天
    学习Java第五天
  • 原文地址:https://www.cnblogs.com/cervusy/p/9647438.html
Copyright © 2011-2022 走看看