zoukankan      html  css  js  c++  java
  • 1079 中国剩余定理(模板)

    一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K。例如,K % 2 = 1, K % 3 = 2, K % 5 = 3。符合条件的最小的K = 23。
     

    输入

    第1行:1个数N表示后面输入的质数及模的数量。(2 <= N <= 10)
    第2 - N + 1行,每行2个数P和M,中间用空格分隔,P是质数,M是K % P的结果。(2 <= P <= 100, 0 <= K < P)

    输出

    输出符合条件的最小的K。数据中所有K均小于10^9。

    输入样例

    3
    2 1
    3 2
    5 3

    输出样例

    23

    基础知识:

    x≡a1( mod m1) x≡a2( mod m2) ......x≡an( mod  mn);

    其中,m1.m2,m3.....,mn是两两互质的整数

    令M=(m1*m2*m3....*mn);

    Mi=M/mi, ti是方程Mi*ti≡1(mod mi)的一个解

    那么x有整数解,解为x = 求和1~n(ai*Mi*ti);

    证明如下:

    因为Mi=m/mi 是除了mi之外所有模数的倍数 所以如果代入x=Σ(1~n) ai*Mi*ti,原方程组成立

    可以理解为每个aiMiti只对i这个方程有贡献,对其他方程都没有影响

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll arr[15],brr[15];
     5 int n;
     6 ll X,Y;
     7 ll gdc(ll a,ll b) { return b==0?a:gdc(b,a%b); }
     8 void exgdc(ll a,ll b,ll &X,ll &Y){
     9     if(b==0){
    10         X=1,Y=0;return;
    11     }
    12     exgdc(b,a%b,X,Y);
    13     ll temp=X;
    14     X=Y;
    15     Y=temp-a/b*Y;
    16 }
    17 
    18 
    19 int main(){
    20     ios::sync_with_stdio(false);
    21     cin>>n;
    22     ll lcm=1;
    23     for(int i=1;i<=n;i++){
    24         cin>>arr[i]>>brr[i];
    25         lcm*=arr[i];
    26     }
    27     ll res=0;
    28     for(int i=1;i<=n;i++){
    29         exgdc(lcm/arr[i],arr[i],X,Y);
    30         X=(X+arr[i])%(arr[i]);
    31         res=(res+brr[i]*X*lcm/arr[i]);
    32     }
    33     cout << res%lcm << endl;
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    python 高级之面向对象初级
    算法之算数表达式后序表示
    python高级之函数
    算法之最短路径
    算法之各种排序
    算法之使用递归求解迷宫问题
    python基础之文件读写
    python基础之编码问题
    python基础之dict、set及字符
    python基础之循环结构以及列表
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/11521372.html
Copyright © 2011-2022 走看看