zoukankan      html  css  js  c++  java
  • 中国剩余定理

    剩余定理是中国古代求解一次同余式组(同余)的方法,设有一个数除三余二,除五余三.除七余二,问最小是多少

    1.求出最小公倍数3*5*7=105

    2.105÷5=21

     21÷5=4......1

     定理2把1扩大3倍得到3,那么被除数也扩大3倍,得到21*3=63//基础数63

    3.105÷7=15

    15÷7=2......1

    定理2把1扩大2倍得到2,那么被除数也扩大2倍,得到15*2=30//基础数30

    把得到的基础数加和(注意:基础数不一定就是正数)

    35+63+30=128

    4、减去最小公倍数(在比最小公倍数大的情况下)

    x=128-105=23

    那么满足题意得最小的数就是23了。

    代码模板

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int exgcd(int a,int b,int &x,int &y)
     6 {
     7     int d;
     8     if(b==0)
     9     {
    10         x=1;y=0;
    11         return a;
    12     }
    13     d=exgcd(b,a%b,y,x);
    14     y-=(a/b)*x;
    15     return d;
    16 }//扩展欧几里得算法求解逆元
    17 
    18 int china(int r[],int p[],int len)//r为余数,p为任意数x
    19 {
    20     int M=1,m,x,y,sum=0;
    21     for(int i=0;i<len;i++) M*=p[i];
    22     for(int i=0;i<len;i++)
    23     {
    24         m=M/p[i];//除去自身的除数
    25         exgcd(p[i],m,x,y);//乘法逆元计算w[i]*x+m*y=gcd(w[i],m)的一个解y  
    26         sum=(y*m*r[i]+sum)%M;//累加整数解y并不断对M取余,m相当于基础数,r为余数,m若扩展欧几里得ab互素,则为1
    27     }
    28 
    29     return (M+sum%M)%M;//使得求出的书最小
    30 }
  • 相关阅读:
    树上路径
    [HNOI2017]礼物
    Spoj 8372 Triple Sums
    [Swerc2014 C]Golf Bot
    【bzoj2194】快速傅立叶之二 FFT
    Linux下perl模块安装
    angularjs form表单验证
    Angularjs兼容IE
    input file限制上传文件类型
    angularjs判断页面数据是否渲染完成
  • 原文地址:https://www.cnblogs.com/Fy1999/p/8858404.html
Copyright © 2011-2022 走看看