[일반적으로 사용되는 알고리즘 요약 - 중국 잉여 정리]

또한 중국 잉여 정리로 알려진 중국 잉여 정리, (이름을 아는 무엇) 하는 방법의 적합성 그룹 (합동 참조) 고대 중국을 해결하는 것입니다. 번호 이론은 중요한 정리이다. 먼저, 조금하자! 케이스! 제목! 지금!

참고 : 세 수 abc 방송이, 나머지는 M1의 m2의 m3, 올해의 나머지 부분에 대해 계산 %였다, && 은 "및"연산자입니다. 

1 , 각각 두 개의 숫자를 나눌 수 있습니다 발견하고 최소 수는 3 분의 1 이상로 나누어 충족합니다. 

K1 %의 B %의 C K1 == == 0 && % A를 == K1 1. , 

K2의 % %의 K2 == C의 == 0 && %의 B == K2 1. , 

K3의 % %의 B의 K3 == == 0 && % C K3 == 1이다. ] 

(2) , 디지털 가입 승산기 I 대응 플러스 세 미지수, 즉 얻어진 결과의 최소 공배수의 정수배 세의 수를 뺀다. 

대답 = M1 + K2 × M2 + K3 × K1 × M3 - P × (C × × B) 

P 답변을 만족 > ; 큰 정수 0 

또는 응답 = (K1 × M1 + K2 × M2 + K3 × M3)를 % (c × B A ×) ;

의 작은 물결을 증명하자

 

 M2 = M1 설정 * M * ... Mn은 

  미 = M / 마일 

  역원 미 미 세트 ^ (- . 1 ) (국방부를 MI) 

  갖는 미 * 미 ^ (- . 1 ) ≡ . 1 (마일 MOD ) 

  AI * 미 * 미 ^ (- . 1 ) ≡ai (마일 MOD) 

  I와 동일하지 모든 J에 대한 

  AI * 미 * 미 ^ (- . 1 ) ≡ 0 (MJ MOD) 

  그래서 해답 모든 AI * 미 * 미 ^ (- . 1 ) (P MOD) 값

P3868은 [TJOI2009] 추측

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long x,y;
 4 long long a[15],b[15];
 5 long long n;
 6 void exgcd(long long A,long long B)
 7 {
 8     if(B==0)
 9     {
10         x=1;
11         y=0;
12         return;
13     }
14     exgcd(B,A%B);
15     long long z=x;
16     x=y;
17     y=z-(A/B)*y;
18 }
19 long long fast(long long a1,long long b1,long long mod)
20 {
21     long long ans=0;
22     a1%=mod;
23     b1%=mod;
24     while(b1)
25     {
26         if(b1&1)
27         {
28             ans=(ans+a1)%mod;
29         }
30         b1>>=1;
31         a1=(a1+a1)%mod;
32     }
33     return ans;
34 }
35 long long china()
36 {
37     long long ans=0;
38     long long M=1;
39     for(long long i=1;i<=n;i++)
40         M*=b[i];
41     for(long long i=1;i<=n;i++)
42     {
43         long long m=M/b[i];
44         exgcd(m,b[i]);
45         while(x<0)
46             x+=b[i]; 
47         x%=b[i];
48         ans=(ans+fast(x,fast(m,(a[i]+M)%M,M),M)+M)%M;
49     }
50     return ans;
51 }
52 int main()
53 {
54     cin>>n;
55     for(long long i=1;i<=n;i++)
56     {
57         scanf("%lld",&a[i]);
58     }
59     for(long long i=1;i<=n;i++)
60     {
61         scanf("%lld",&b[i]);
62     }
63     cout<<china();
64     return 0;
65 }

 

추천

출처www.cnblogs.com/hualian/p/11242504.html