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

    中国剩余定理是中国古代求解一次同余式组(见同余)的方法,是数论中一个重要定理,又称孙子定理。

    孙子定理

      孙子定理主要用来求解模线性不定方程组。

      对于方程组:

             x0≡a0(mod b0)

           x1≡a1(mod b1)

           x2≡a2(mod b2) 

           .  .  .  

           xn≡an(mod bn)

      设m=b0*b1*b2*...*bn,mi=m/bi

      得到方程组

          mixi+biyi=1

      扩欧求解后,原模线性方程组的解为:

          ∑mi*ai*xi  mod m

    看代码吧:

     1 #include <cstdio>
     2 using namespace std;
     3 const int MAXN=10050;
     4 int n;
     5 int a[MAXN],b[MAXN];
     6 
     7 void exgcd(long long a,long long b,long long &x,long long &y)
     8 {
     9     if(a%b==0)
    10     {
    11         x=0;y=1;return ;
    12     }
    13     exgcd(b,a%b,x,y);
    14     long long t=x;
    15     x=y;y=t-a/b*y;
    16 }
    17 
    18 long long China_Reminder(int n)
    19 {
    20     long long m=1,mi,res=0,x,y;
    21     for(int i=1;i<=n;i++)m*=b[i];
    22     for(int i=1;i<=n;i++)
    23     {
    24         mi=m/b[i];
    25         exgcd(mi,b[i],x,y);
    26         x=(x%b[i]+b[i])%b[i];
    27         res=(res+mi*a[i]*x%m)%m;
    28     }
    29     return (res+m)%m;
    30 }
    31 
    32 int main()
    33 {
    34     scanf("%d",&n);
    35     for(int i=1;i<=n;i++)scanf("%d %d",&a[i],&b[i]);
    36     printf("%lld
    ",China_Reminder(n));
    37     return 0;
    38 }
    View Code

    例题:fzu1402 猪的安家

  • 相关阅读:
    shell基础
    函数属性
    this的使用
    循环
    正则表达式中的方法
    判断是不是数组
    ECMAScript5中数组方法
    ECMAScript3中数组方法
    break和continue、return的区别
    用来枚举属性的对象工具函数
  • 原文地址:https://www.cnblogs.com/lzxzy-blog/p/10311968.html
Copyright © 2011-2022 走看看