zoukankan      html  css  js  c++  java
  • 【luogu4777】扩展中国剩余定理(EXCRT)[数论 扩展中国剩余定理]

    P4777 【模板】扩展中国剩余定理(EXCRT)

    我的扩中终于出生了!!!!!!

    历经磨难

    开始没看题 这个题居然是求 x ≡ b (mod a) 啊啊啊啊啊啊就一直输出无解

    然后又把判断无解的 if(c%gcd) return -1; 打成了if(!c%gcd) return -1; 而且还有几个地方忘了开long long

    都这样了我都还有6昏 tql具体是酱紫:

    就是用扩欧求解

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1e5+5;
     4 #define ll long long
     5 ll n,ai[N],bi[N];
     6 template<class t>void rd(t &x)
     7 {
     8     x=0;int w=0;char ch=0;
     9     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    10     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    11     x=w?-x:x;
    12 }
    13 
    14 ll exgcd(ll a,ll b,ll &x,ll &y)
    15 {
    16     if(!b) {x=1,y=0;return a;}
    17     ll gcd=exgcd(b,a%b,x,y);
    18     ll t=x;x=y,y=t-a/b*y;
    19     return gcd;
    20 }
    21 
    22 ll mul(ll a,ll b,ll mod)
    23 {
    24     ll ans=0;
    25     while(b)
    26     {
    27         if(b&1) ans=(ans+a)%mod;
    28         a=(a+a)%mod,b>>=1;
    29     }
    30     return ans;
    31 }
    32 
    33 ll excrt()
    34 {
    35     ll x,y;
    36     ll M=bi[1],ans=ai[1];//第一个方程的解
    37     for(int i=2;i<=n;i++)
    38     {
    39         ll a=M,b=bi[i],c=(ai[i]-ans%b+b)%b;
    40         ll gcd=exgcd(a,b,x,y),bg=b/gcd;
    41         //求方程 t*M mod bi =ai-x 的解t
    42         if(c%gcd) return -1;
    43         x=mul(x,c/gcd,bg);
    44         ans+=x*M,M*=bg,ans=(ans%M+M)%M;
    45      }
    46      return (ans%M+M)%M;
    47 }
    48 
    49 int main()
    50 {
    51     rd(n);
    52     for(int i=1;i<=n;i++) rd(bi[i]),rd(ai[i]);
    53     printf("%lld",excrt());
    54     return 0;
    55 }

  • 相关阅读:
    Toggle控制窗口的显隐
    碰撞检测(2D&&3D)
    3D空间 圆柱体画线
    鼠标拖动2D物体(图片)
    实现图片的闪烁效果
    UI 2D图片随鼠标旋转
    射线检测(Summary)
    [转]C#静态方法与非静态方法的比较
    获取精灵
    用于切割字符串的方法
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/10542770.html
Copyright © 2011-2022 走看看