2 条题解

  • 14
    @ 2022-5-27 15:04:08

    中国剩余定理

    常用来解一元线性同余方程组

    一般从这个问题引入,某物品三三数之余二,五五数之余三,七七数之余二。问物几何?

    写成方程组的形式就是求解

    {x 2 mod 3x 3 mod 5x 2 mod 7\left\{ \begin{matrix} x\equiv\ 2\ mod\ 3 \\ x\equiv\ 3\ mod\ 5 \\ x\equiv\ 2\ mod\ 7 \end{matrix} \right.

    首先,若x0x_0为原方程的一个解,那么x0+357kk整数x_0+3*5*7*k,k\in 整数,也是一个解

    解上述方程组其实首先需要解以下3个方程,这里有点线性代数的意思。

    {x 1 mod 3x 0 mod 5x 0 mod 7\left\{ \begin{matrix} x\equiv\ 1\ mod\ 3 \\ x\equiv\ 0\ mod\ 5 \\ x\equiv\ 0\ mod\ 7 \end{matrix} \right.

    {x 0 mod 3x 1 mod 5x 0 mod 7\left\{ \begin{matrix} x\equiv\ 0\ mod\ 3 \\ x\equiv\ 1\ mod\ 5 \\ x\equiv\ 0\ mod\ 7 \end{matrix} \right.

    {x 0 mod 3x 0 mod 5x 1 mod 7\left\{ \begin{matrix} x\equiv\ 0\ mod\ 3 \\ x\equiv\ 0\ mod\ 5 \\ x\equiv\ 1\ mod\ 7 \end{matrix} \right.

    记上述三组的解记为

    [100]\begin{bmatrix} 1\\ 0\\ 0\\ \end{bmatrix}

    [010]\begin{bmatrix} 0\\ 1\\ 0\\ \end{bmatrix}

    [001]\begin{bmatrix} 0\\ 0\\ 1\\ \end{bmatrix}

    则原方程的解为 22*[100]\begin{bmatrix} 1\\ 0\\ 0\\ \end{bmatrix}+33*[010]\begin{bmatrix} 0\\ 1\\ 0\\ \end{bmatrix}+22*[001]\begin{bmatrix} 0\\ 0\\ 1\\ \end{bmatrix}

    问题的关键显然是求上述三组解。 上述三组解是这样求的,先来看第一个。

    {x 1 mod 3x 0 mod 5x 0 mod 7\left\{ \begin{matrix} x\equiv\ 1\ mod\ 3 \\ x\equiv\ 0\ mod\ 5 \\ x\equiv\ 0\ mod\ 7 \end{matrix} \right.

    x一定是35的倍数x一定是35的倍数,所以设x=35yx=35*y,那么35y  1 mod 335y\ \equiv\ 1\ mod\ 3,这里容易求出yy22,实际也能看出就是逆元。

    求出22以后,x=352=70x=35*2=70,那么第一个方程组的一个特解就出来了。

    同理求出其余的两个方程组的特解分别是x=21,x=15x=21,x=15

    则原方程的解为270+321+215  23 mod 1052*70+3*21+2*15\ \equiv\ 23\ mod\ 105 ,所以这里就求出了23.

    因此从这里也能看出线性同余方程组的求解方式,方法就是。

    {x b1 mod a1x b2 mod a2x bk mod ak\left\{ \begin{matrix} x\equiv\ b_1\ mod\ a_1 \\ x\equiv\ b_2\ mod\ a_2 \\ …… \\ x\equiv\ b_k\ mod\ a_k \\ \end{matrix} \right.

    首先还是按照刚才的方式分出多个方程组来,求出每一个的,最后求和。

    1. 首先求出N=a1a2akN=a_1*a_2*……*a_k
    2. 对于每一组方程我们按照上面的例题思路来求解,设m=N/aim=N/a_i,那么紧接着我们需要求出mx  1 mod aimx\ \equiv\ 1\ mod\ a_i,求出这个x以后x以后
    3. 那么最终这个方程组的解就是mxbim*x*b_i,回想刚才不就是35mx求逆元是2bi235是m,x求逆元是2,b_i是2,所以是352235*2*2,对应上面的2702*70.
    4. 然后循环求和,并且求和的时候对NN取余得到答案。

    本题实际就是

    {x p mod 23x e mod 28x i mod 33\left\{ \begin{matrix} x\equiv\ p\ mod\ 23 \\ x\equiv\ e\ mod\ 28 \\ x\equiv\ i\ mod\ 33 \end{matrix} \right.

    根据刚才我们的方法,首先计算第一个式子的时候,需要算出 283328*33 应该就是924924924924关于2323的逆元是66,所以9246924*6也就是55445544然后乘以pp,得到第一组的答案,类似其余的答案就是14421e14421*e,1288i1288*i.

    最终答案就是(5544p+14421e+1288id+lcm)%lcm(5544 * p + 14421 * e + 1288 * i - d + lcm) \% lcm 算的是距离dd开始以后多少,所以减去dd,同时避免出现负数所以加lcmlcm以后在取余。

    lcm=232833lcm=23*28*33

    如果算下来答案是00,记得输出lcmlcm而不是输出00

        cin >> p >> e >> i >> d;
        lcm = 23 * 28 * 33;
        ans = (5544 * p + 14421 * e + 1288 * i - d + lcm) % lcm;
        cnt++;
        if (ans == 0)
            ans = lcm;
        cout << ans;
    
    • -3
      @ 2022-4-24 16:41:35

      写题解请注意

      鼓励大家写题解,但注意题解格式。

      题解一定要有思路解析或代码注释,能否让别人理解你的思路

      也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

      给代码两端加上这个会舒服一些

      ```cpp

      你的代码

      ```

      </span>

      这个点在键盘的左上角tab上面那个键,注意切换输入法

      #include<iostream>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;//这是一个注释
          return 0;
      } 
      

      请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

      抄袭题解一经发现直接取消成绩。

      题解被删除的可能

      1. 代码不符合格式规范
      2. 没有思路讲解或者没有注释,
      3. 无意义的题解

      大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • 1

      信息

      ID
      192
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      290
      已通过
      121
      上传者